安全注释@PreAuthorize在@Controller中不起作用,仅在带有Spring Security 3.2.5的@Service中生效

时间:2015-02-26 11:17:02

标签: spring spring-security spring-annotations

正如标题所暗示的那样。

Bellow是我的春季安全配置:


@Configuration
@EnableGlobalMethodSecurity(proxyTargetClass = true, prePostEnabled = true)
@EnableWebMvcSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Autowired
    private AbstractAuthenticationProcessingFilter userPassAuthFilter;

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.
                authorizeRequests()
                .anyRequest().authenticated()
                .and()
                .csrf().disable();
        http.addFilterBefore(userPassAuthFilter, BasicAuthenticationFilter.class)
                .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS);
    }

}

我的控制员:


@RestController
@Transactional
public class RoleController {

    @Autowired
    private UserBusinessService userBusinessService

    @RequestMapping(value = "/api/list_users", method = RequestMethod.GET)
    @PreAuthorize("hasRole('N123ORMAL_ROLE1')")
    public Iterable listUsers() {
        return userBusinessService.getAllUsers();
    }

}

有了这个,当尝试使用没有指定角色的用户访问 / api / list_users 时,它可以获得它,没有任何问题。即使是日志也很完美​​,没有注意到任何事情。在@PreAuthorize userBusinessService移动getAllUsers()时,它会按预期运行:日志中会抛出错误,并返回拒绝访问。

任何人都可以帮助我使@PreAuthorize注释适用于@Controller@Service相同吗?

1 个答案:

答案 0 :(得分:2)

我遇到了与@Transactional和@PostFilter类似的问题。问题是aop建议订购问题。

在这方面,这个问题帮助了我:Order of Spring @Transactional and Spring Security @PreAuthorize

我希望有助于解决您的问题。