Spring Security 小记 - @Secured(), @PreAuthorize() 及 @RolesAllowed()

目录

  • Spring Security 小记
    • 前言
    • 权限注解
    • 小坑

Spring Security 小记

记录一下Spring Security(版本为4) 中的 @Secured(), @PreAuthorize() 及 @RolesAllowed()

前言

Spring Security 和Shiro 可以说是安全框架的唯二选择了。 Shiro,比较简单和灵活,简单够用。而Spring Security的功能和shiro都差不多,复杂一点,权限细粒度更高。但是因为SpringBoot,还是很值得尝试的。 Spring 全家桶 , 一用便知道。

权限注解

通常采用@Secured ,@PreAuthorize和@RolesAllowed 来对方法进行权限控制。
使用这些注解,先要配置@EnableGlobalMethodSecurity(securedEnabled = true)

这里看一下官网的例子

public interface BankService {

@Secured("IS_AUTHENTICATED_ANONYMOUSLY")
public Account readAccount(Long id);

@Secured("IS_AUTHENTICATED_ANONYMOUSLY")
public Account[] findAccounts();

@Secured("ROLE_TELLER")
public Account post(Account account, double amount);
}

@Secured和@PreAuthorize用法基本一样,但是里面有个大坑。
@RolesAllowed 是JSR250定义的注解
配置方式不一样:@EnableGlobalMethodSecurity(jsr250Enabled=true)
JSR250注解还有 @DenyAll 和 @PermitAll 。

小坑

之前运行同事的代码,发现权限控制失效。区别在于使用@Secured,而@Secured对应的角色必须要有ROLE_前缀。

通常在项目里面会实现UserDetails写user类,关键在于getAuthoritie()方法里面生成的role有没有前缀ROLE_。
使用@PreAuthorize是可以随意设置的

@PreAuthorize("hasAuthority('ADMIN')")@PreAuthorize("hasAuthority('ROLE_ADMIN')")  // 都可以,只要和实现的getAuthoritie里面的role对上
就可以

@Secured({"ADMIN"})@Secured({"ROLE_ADMIN"}) // 实现的getAuthoritie里面的role都必须要有ROLE_前缀

你可能感兴趣的:(Spring,JAVA)