在新用户提交"新帐户"表单后,我想手动将该用户登录,这样他们就不必在后续页面上登录.
通过spring安全拦截器的普通表单登录页面工作得很好.
在新帐户形式的控制器中,我正在创建UsernamePasswordAuthenticationToken并手动在SecurityContext中设置它:
SecurityContextHolder.getContext().setAuthentication(authentication);
Run Code Online (Sandbox Code Playgroud)
在同一页面上,我稍后检查用户是否已登录:
SecurityContextHolder.getContext().getAuthentication().getAuthorities();
Run Code Online (Sandbox Code Playgroud)
这将返回我之前在身份验证中设置的权限.一切都很好.
但是当我加载的下一页上调用相同的代码时,身份验证令牌就是UserAnonymous.
我不清楚为什么它没有保留我在上一个请求中设置的身份验证.有什么想法吗?
只是寻找一些可能有助于我了解这里发生了什么的想法.
我们用我们自己的 User 对象扩展了主体。这样,该对象对于每个请求都是可用的。当用户更新其信息时,主体需要使用这些新数据进行更新。当不使用 spring-session 时,此方法有效。然而,对于 spring-session 来说,情况并非如此。
我检查了 spring-session 代码,以及RedisOperationsSessionRepository:save(RedisSession session)唯一的调用session.saveDelta(),它仅保存更改的属性。那么,我们如何在会话中更新主体呢?
注意 - 更新主体的地方位于服务层,因此我们无权访问SessionAuthenticationStrategy.
我正在尝试使用Spring Security以编程方式验证用户登录/传递,因此我需要访问ProviderManager.我希望它能自动注入我的@Controller.
我的代码看起来像:
import org.springframework.security.authentication.ProviderManager;
// ...
@Controller
public class MyController {
@Autowired
private ProviderManager authenticationManager;
Run Code Online (Sandbox Code Playgroud)
但是当我尝试运行应用程序时,我收到以下错误消息:
No unique bean of type [org.springframework.security.authentication.ProviderManager] is defined:
expected single matching bean but found 2:
[org.springframework.security.authentication.ProviderManager#0, org.springframework.security.authenticationManager]
Run Code Online (Sandbox Code Playgroud)
可能是什么原因或我如何解决?
我使用Spring Security 3.0.0-RC1和Spring 3.0.1,我没有定义任何ProviderManagerbean.我成功使用了:
@Resource
private ProviderManager authenticationManager;
Run Code Online (Sandbox Code Playgroud)
在其他项目中,但javax.annotation.ResourceGAE不支持.