1) 有没有办法实现自定义登录模块,该模块将对用户进行身份验证,但仍然使用 Spring Security 来管理登录和注销后的访问控制。
是的。您可以通过实现 org.springframework.security.authentication.AuthenticationProvider 并使其成为 bean(注释它或在 XML 中)来提供自己的身份验证机制:
@Service("myAuthenticationProvider") 公共类 TangoAuthenticationProvider 实现 AuthenticationProvider{
@Override
public boolean supports(Class<?> authentication) {
//your code
}
@Override
public Authentication authenticate(Authentication authentication)
throws AuthenticationException {
//your code
}
然后,并指示 Spring 安全性使用它(在您的安全性上下文中):
<authentication-manager>
<authentication-provider ref="tangoAuthenticationProvider" />
</authentication-manager>
看到这个问题,当然还有spring security doc。
2) 动态创建的角色:我无法回答 thios 部分,没有这方面的经验。
3) 单次会议要求
也许在 Spring Security 中内置了这样一个机制(你必须研究这个),但我认为你可以使用简单的会话侦听器和前面提到的自定义身份验证机制来实现它:
- 将会话 ID 字段添加到您的用户实体(或其他地方,但以某种方式将您的用户 ID 与会话 ID 相关联)
创建一个服务,允许存储对其 id 关联的会话的引用,并通过其 id 提供对会话的访问。您可以使用静态哈希图,或单例,或者更好的 Spring 服务 bean,其接口大致如下(我们称其为会话存储库):
public void putSession(String id, HttpSession session); 公共 HttpSession getSessionById(String id);
在您的身份验证提供程序中,成功登录后,将用户的会话 id 字段设置为当前会话 id
- 在身份验证逻辑中,如果用户的 sessionId 字段不为空,则禁止身份验证(那么您不需要对会话机制的引用),或者更可能是真正的要求,继续使用户的其他正在进行的会话,通过使用用户的 sessionId 字段的值从会话存储库中获取它
- 在会话监听器中:在会话创建时:在会话存储库中存储会话在会话删除时:如果有登录用户,则清除其 sessionId 字段;清除对会话的引用以避免内存泄漏。
这是与安全性(跨会话内容)相关的敏感代码,因此应该非常仔细地编写和测试它!
我希望它有所帮助。