Spring安全要求和问题

时间:2013-06-14 12:08:17

标签: java spring-security session-timeout

我正在开发一个使用Spring MVC和Spring REST的应用程序,它分为2个服务器,后端是Spring REST接口,前端是普通的SPRING MVC应用程序。然而,我有一些安全要求,特别是对于MVC服务器前端,例如

  1. 每个用户只有一个活动会话
  2. 指定时间后的会话超时
  3. 能够从应用程序中的表单创建新角色,并将这些角色应用于在运行时动态访问的URL,而不是硬编码到配置中。
  4. 我的问题是

    1. 是否有办法实现自定义登录模块,该模块将对用户进行身份验证,但仍然使用Spring Security在登录和注销后管理访问控制。
    2. 我见过的所有示例都使用在Spring配置文件中配置的预定义角色,但是我们的要求是我们不知道将在系统中的角色以及在部署时允许他们访问的URL,所有这些都是由管理员通过UI配置的,所以问题是我可以用任何一个例子来看看如何在Spring Security中处理这个问题。
    3. 最后提到上面提到的单一会话要求。
    4. 任何指针都会非常感激。

2 个答案:

答案 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中的机制(你必须对此进行研究),但我认为你可以使用简单的会话监听器和前面提到的自定义身份验证机制来实现它:

  1. 向您的用户实体添加会话ID字段(或其他地方,但以某种方式将您的用户ID与会话ID相关联)
  2. 创建一个服务,允许存储对与其id相关联的会话的引用,并通过其id提供对会话的访问。你可以使用一个静态的hashmap,或者一个单独的,或者更好的Spring服务bean,它具有大致以下的接口(让我们称之为会话存储库):

    public void putSession(String id,HttpSession session); public HttpSession getSessionById(String id);

  3. 在您的身份验证提供程序中,成功登录后,将用户的会话ID字段设置为当前会话ID

  4. 在身份验证逻辑中,如果用户的sessionId字段不为null,则禁止身份验证(然后您不需要对会话机制的引用),或者更可能是真正的需求,继续通过使用用户的sessionId字段值从会话存储库获取会话,使用户的其他正在进行的会话无效
  5. 在会话侦听器中: 在会话创建时:在会话存储库中存储会话 在会话中删除:如果有登录用户,请清除其sessionId字段;清除对会话的引用以避免内存泄漏。
  6. 这是与安全性相关的敏感代码(跨会话内容),所以应该非常仔细地编写和测试它!

    我希望它有所帮助。

答案 1 :(得分:0)

您可以使用表单登录。

为了创建动态角色,您可以使用一个方法实现UserDetailsS​​ervice接口,

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对。