Controller动态地拒绝Controller中的一些页面

时间:2014-08-17 15:01:16

标签: spring spring-mvc java-ee

根据用户的付款状态情况,我想限制对该用户的某些页面的访问权限。它应该在Controller方法(GET请求)中完成。

我知道Spring可以拦截URL,但它对我来说听起来是静态配置。如果我想通过Controller拦截URL然后为用户阻止某些页面!,我该如何实现?

我正在使用Spring和Security 3.2.x版本。我为这种情况附加了最小流量:

感谢。

enter image description here

2 个答案:

答案 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;
    }
}

更新(感谢@Pujan Srivastava评论):

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。

您可以查看一些博文herehere

如果你需要更精细的控制,你当然可以使用常规的Spring AOP。