我正在开发一个新的实验性Web应用程序框架,我决定给RESTful一些关注.我已经阅读了基础知识,并且觉得我对RESTful作为一个概念非常了解.
我已经启动并运行了一个系统,严格使用URL来定义系统中的"名词",并从HTTP请求方法中获取"动词".我正在使用javascript ajax调用来提供对HTML表单无法提供的DELETE和PUT方法的访问.(我意识到这些措施并非严格要求是RESTful,但它满足'统一接口'的要求).
问题在于无状态和可缓存性与身份验证.用于网站上的用户认证的标准模型涉及"登录"认证事件,之后(如果成功)用户具有持久安全会话的"在墙内",并且可以在未经认证的用户可能没有的后续请求上查看和执行操作.这种身份验证的持久性似乎打破了RESTful-ness.缓存和无状态似乎被破坏,因为经过身份验证的用户可能会看到与未经身份验证的用户将针对同一请求看到的HTML不同的HTML(例如,在边栏中可能有一个登录表单用于记录 - 用户).
使用www-authenticate策略仅对需要身份验证的请求对用户进行身份验证似乎是朝着正确方向迈出的一步,因为它不涉及持久安全会话的概念.然而,仍然存在如何向最终用户描绘"登录"外观以保持我们对网站的期望.
那么在目前的想法中,以严格的REST方式处理网页的身份验证和权限的首选方法是什么,同时仍允许HTML中的登录装饰?
我假设如果实例变量由spring IOC管理,并且是单例,那么desgin可以被称为无状态和线程安全.因此,这种类型的设计可以扩展到集群服务器.我的假设是否正确,如下所述?
@Repository("myDao")
public class MyDao implements Dao {
@Autowired
private JdbcTemplate jdbcTemplate;
@Value("${sqlFoo}")
private String foo;
@Override
public Integer getMyInt(String str) {
return jdbcTemplate.queryForInt(foo, str);
}
Run Code Online (Sandbox Code Playgroud)
然后注入:
@Service("myService")
public class MyServiceImpl {
@Resource(name = "myDao")
Dao dao;
@Override
@Transactional(readOnly = true)
public int getScore(String str) {
return dao.getMyInt(str);
}
}
Run Code Online (Sandbox Code Playgroud) 凭借15年的有状态客户端 - 服务器软件开发经验(以及它固有的问题),我仍然试图在RestFul架构中掌握无状态的概念.
假设我有一个通用接口将业务对象发布到我的REST服务.例如用户资源.我的用户资源应该限制其电子邮件地址的唯一性.我最初的反应是使用底层的数据库工具"garantuee"这个.第二个反应是引入一些锁定或事务机制.
但我的Restafarian同事回答:"不!" 客户端应检查新用户的电子邮件是否唯一,您应该接受这样一个事实,即可以插入重复的电子邮件地址的小窗口时间.客户端应用程序应该能够处理此冲突.
这反过来反对我所学到的一切,根本不自然.请赐教......
我最近一直在考虑如何正确地使用我的webframework/application-stack.我正在慢慢转向scala和函数式编程(来自Python和CherryPy).因此,调查Play是很自然的,因为它是最广泛支持的框架(现在即使是Typesafe也采用了它).如果我在这里遗漏了什么,请随意纠正我.
因此,游戏真正拥抱无状态webapps的想法,我很难在身份验证和授权方面解决它.现在经过一些在线挖掘(基于表单的网站身份验证的权威指南)后,我得出的结论是,必须对我的后端(JSON-RPC或其他)的每次调用进行身份验证和授权,远离旧会话 -饼干的想法.
现在有什么最好的方法来实现今天的技术?
那怎么样:
我想到了"简单"DigestAuth,因为它被证明并且广泛存在但是它对旧的和生锈的基本认证有类似的感觉.
谢谢!
Spring Security是一个非常灵活的框架,当然可以创建无状态每请求身份验证的实现来保护Business-2-Business REST API.
但是,最好的方法是什么?
OAuth和OAuth2超出了此问题的范围.
特别感兴趣的是基于API-Key和API-Secret对的解决方案,其中:
有关实现和配置详细信息,实现每个请求身份验证并启用基于GrantedAuthorities的后续访问控制的方法是什么?
这是一篇博客文章,其中有一个值得注意的建议,但这看起来非常具体且相当复杂.
在python中创建高度集成的代码很容易,因此在代码更改时退出并重新启动应用程序的需求是可以理解的.
但是,肯定必须存在一些策略和模型才能隔离部分代码,以便在不需要退出和重新启动的情况下即时更新.
对于我正在处理的应用程序,许多功能将是主应用程序将与之通信的独立后台任务,呈现状态信息以及指示基于当前状态执行任务.在许多方面,这些后台任务可以被视为独立程序,只是它们与主应用程序以及构建在其上的其他工具,任务等共享一些代码库.
虽然可能很难让整个shebang实时更新,但我确信必须有可能推出更新并让运行代码根据需要注意和更新自身的方法.
由于我也热衷于利用多线程和asyncio(在Python 3.5中),以及探索使事情无状态,在逻辑上可以在这里做一些有趣的事情,至少可以避免一些强制重启时推出新代码.
非常感谢有关如何使其工作的信息的提示和指示.
有没有办法从不同的类库项目访问Service Fabric Stateless Service的自定义配置值?我可以从StatelessService本身访问当前这样的配置.
var configurationPackage = Context.CodePackageActivationContext.GetConfigurationPackageObject("Config");
var connectionStringParameter = configurationPackage.Settings.Sections["QueueConfigSection"].Parameters["QueueName"];
Run Code Online (Sandbox Code Playgroud)
如何从其他项目访问此Context.CodePackageActivationContext?或者我如何将无状态服务上下文公开给另一个项目?
在REST api中,处理项目的用户特定数据的最有效方法是什么?
例如,假设有些item
资源可以受到青睐.可以通过以下方式访问项目列表:
https://myservice.com/api/items (Full list)
https://myservice.com/api/items/{id} (Single item)
Run Code Online (Sandbox Code Playgroud)
哪个回报
{
{ 'name': 'name 1' },
{ 'name': 'name 2' },
}
Run Code Online (Sandbox Code Playgroud)
每个项目都可以受到用户(https://myservice.com/api/user/{id}
)的青睐,这些收藏的列表可以在以下位置获得:
https://myservice.com/api/user/{id}/favorites
Run Code Online (Sandbox Code Playgroud)
整个设置是无状态的; 但是,可能有数百个收藏夹,并且可能不需要检索完整列表.
问:在维护无状态系统的同时,将项目与用户特定数据相结合的最佳方法是什么?
即获得用户特定的项目列表是否合理或合理:
https://myservice.com/api/items?user={id}
{
{ 'name': 'name 1', 'isFavourite':true },
{ 'name': 'name 2', 'isFavourite':false },
}
Run Code Online (Sandbox Code Playgroud) 我从 SignalR 客户端应用程序连接到 SignalRHub 时遇到问题,下面给出的是错误日志-
info: Microsoft.AspNetCore.Sockets.Client.WebSocketsTransport[0]
02/01/2018 15:20:13: Connection Id f763a939-3fb9-4812-ae6e-dfe3198ab37b: Starting transport. Transfer mode: Text.
fail: Microsoft.AspNetCore.Sockets.Client.HttpConnection[9]02/01/2018 15:20:13: Connection Id f763a939-3fb9-4812-ae6e-dfe3198ab37b: Failed to start connection. Error starting transport 'WebSocketsTransport'.
System.Net.WebSockets.WebSocketException (0x80004005): Unable to connect to the remote server ---> System.Net.WebException: The remote server returned an error: (404) Not Found.
at System.Net.HttpWebRequest.EndGetResponse(IAsyncResult asyncResult)
at System.Threading.Tasks.TaskFactory`1.FromAsyncCoreLogic(IAsyncResult iar, Func`2 endFunction, Action`1 endAction, Task`1 promise, Boolean requiresSynchronization)
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task …
Run Code Online (Sandbox Code Playgroud) stateless websocket signalr azure-service-fabric asp.net-core-mvc-2.0
有了这个功能,现在有两个执行引擎——STATELESS和STATEFUL,但我不确定它们分别适合哪些场景?当我想方便地更新一个或多个参数时,使用steteless执行引擎和命令行吗?如果我需要查看流的状态,使用Nifi UI中的有状态执行引擎吗?
感谢任何帮助!
stateless ×10
rest ×3
http ×2
apache-nifi ×1
api ×1
api-key ×1
database ×1
java ×1
python ×1
python-3.5 ×1
scalability ×1
signalr ×1
spring ×1
spring-boot ×1
stateful ×1
websocket ×1