我需要创建一个系统,根据日期授予对网站的访问权限。
涉及两个角色:管理员和用户
并且有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标签,但我不知道如何做到这一点。
答案 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;
}
}