按日期的春季安全授权

时间:2014-05-20 13:54:59

标签: spring security spring-mvc spring-security

我需要创建一个系统,根据日期授予对网站的访问权限。

涉及两个角色:管理员和用户
并且有2个日期(date1< date2)

这些是要求:

  
      
  • 您无法在date1
  • 之前登录   
  • 仅限管理员可以在date1
  • 之后登录   
  • 在date2之后,每个人都可以访问该页面,无需授权
  •   

这是我的spring-security.xml:

<beans:beans xmlns="http://www.springframework.org/schema/security"
         xmlns:beans="http://www.springframework.org/schema/beans"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://www.springframework.org/schema/beans
     http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
     http://www.springframework.org/schema/security
http://www.springframework.org/schema/security/spring-security-3.2.xsd">

<http auto-config="true">
    <intercept-url pattern="/overview**" access="ROLE_ADMIN" />
    <intercept-url pattern="/subscribe**" access="ROLE_ADMIN" />

    <form-login 
        login-page="/login" 
        default-target-url="/overview" 
        authentication-failure-url="/login?error" 
        username-parameter="username"
        password-parameter="password" />
    <logout logout-success-url="/login?logout"  />
    <!-- enable csrf protection -->
    <csrf/>
</http>

<authentication-manager>
    <authentication-provider ref="customAuthProvider">
    </authentication-provider>
</authentication-manager>

</beans:beans>

我的猜测是我需要编写一个自定义元素来替换intercept-url标签,但我不知道如何做到这一点。

1 个答案:

答案 0 :(得分:1)

您的要求似乎主要是限制人们是否可以根据日期登录(即验证),但您的问题还涉及基于日期对URL的授权。这些不是一回事,您应该明确说明您的意思。例如,当你说每个人都可以在第二个日期之后访问该页面(哪个页面?)时,你是否也意味着不需要登录?或者您是指所有经过身份验证的用户 - 即整个网站是否仍需要身份验证?

如果您只是在谈论限制登录,那么您可以通过查看自定义AuthenticationProvider中的日期来轻松完成此操作。类似的东西:

class MyAuthProvider extends SomeStandardAuthenticationProvider {

    public Authentication authenticate (Authentication a) {
        Authentication authenticated = super.authenticate(a);

        Date now = new Date();
        boolean isAdmin = // check authenticated.getAuthorities() for admin role

        if (now.isBefore(date1 || (isAdmin && now.isBefore(date2)) {
            throw new AuthenticationException("Too early");
        }

        return authenticated;
    }
}