根据用户的付款状态情况,我想限制对该用户的某些页面的访问权限。它应该在Controller方法(GET请求)中完成。
我知道Spring可以拦截URL,但它对我来说听起来是静态配置。如果我想通过Controller拦截URL然后为用户阻止某些页面!,我该如何实现?
我正在使用Spring和Security 3.2.x版本。我为这种情况附加了最小流量:
感谢。
答案 0 :(得分:1)
它可以是控制器方法:
@PreAuthorize("@userSecurityService.hasPaid()")
@RequestMapping(value = "/appointment", method = RequestMethod.GET)
public String appointment() {
//Some code
}
或服务层方法:
@PreAuthorize("@userSecurityService.hasPaid()")
@Transactional
public String appointment() {
//Some code
}
或者其他什么:
@PreAuthorize("@userSecurityService.hasPaid()")
public String appointment() {
//Some code
}
@Component
:@Component("userSecurityService")
public class UserSecurityService {
// You might want inject DAOs or other components for your validations.
@Inject
private UserDao userDao
public boolean hasPaid() {
// You might want access to user info from spring context.
Authentication auth = SecurityContextHolder.getContext().getAuthentication();
// Here you might want to use injected DAOs
// in order to validate the fact that the user had paid (or whatever).
// FIXME
return true;
}
}
Spring AOP必须作为依赖项添加,并且必须启用Spring Security的注释前注释:
我个人使用:
<!-- Spring framework -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>4.0.6.RELEASE</version>
</dependency>
<!-- Spring Security -->
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-config</artifactId>
<version>3.2.5.RELEASE</version>
</dependency>
这使我能够在控制器层中正确配置Spring MVC和Spring Security的所有基本依赖项(并且它包括Spring AOP)。 因此,我只需在服务层中添加spring-security-core依赖项,以保护服务方法。
Java配置示例:
@Configuration
@EnableWebMvcSecurity
@EnableGlobalMethodSecurity(securedEnabled = true, prePostEnabled = true)
public class WebMvcSecurityConfig extends WebSecurityConfigurerAdapter {
...
}
或者像@Pujan Srivastava的xml配置评论:
<sec:global-method-security pre-post-annotations="enabled" proxy-target-class="true"/>
在调度程序xml文件中。
答案 1 :(得分:0)
既然您正在研究一个跨领域的问题,我建议您查看Spring MVC Interceptors。
它们提供开箱即用且极易使用的AOP功能。在您的情况下,您将创建一个拦截器,用于检查付款状态,然后如果付款不正确,可能会重定向到某个特定的URL。
如果你需要更精细的控制,你当然可以使用常规的Spring AOP。