我正在开发一个使用Spring MVC和Spring REST的应用程序,它分为2个服务器,后端是Spring REST接口,前端是普通的SPRING MVC应用程序。然而,我有一些安全要求,特别是对于MVC服务器前端,例如
我的问题是
任何指针都会非常感激。
答案 0 :(得分:1)
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>
请参阅this question,当然还有spring security doc。
2)动态创建角色:我无法回答thios部分,没有经验。
3)单一会话要求
也许有一种内置在Spring Security中的机制(你必须对此进行研究),但我认为你可以使用简单的会话监听器和前面提到的自定义身份验证机制来实现它:
创建一个服务,允许存储对与其id相关联的会话的引用,并通过其id提供对会话的访问。你可以使用一个静态的hashmap,或者一个单独的,或者更好的Spring服务bean,它具有大致以下的接口(让我们称之为会话存储库):
public void putSession(String id,HttpSession session); public HttpSession getSessionById(String id);
在您的身份验证提供程序中,成功登录后,将用户的会话ID字段设置为当前会话ID
这是与安全性相关的敏感代码(跨会话内容),所以应该非常仔细地编写和测试它!
我希望它有所帮助。
答案 1 :(得分:0)
您可以使用表单登录。
为了创建动态角色,您可以使用一个方法实现UserDetailsService接口,
public UserDetails loadUserByUsername(String userId)
throws UsernameNotFoundException, DataAccessException
{
...
/*
fetch your role information every time the user re-login
you can store the new role in the database and fetch it from here
*/
}
之后,您可以使用数据库角色
配置身份验证/授权的spring-security文件对于每个用户要求的单个视图,尝试将所有用户 - sessionid对保留在数据库或应用程序级别的hashmap中。有一个Spring ContextLoaderListener,(钩子下的HttpSessionListener)因此可以从监听器中添加/删除应用程序中的user-sessionid对。