我们在学习shiro的时候,知道有两个注解

@RequiresPermissions("user:ccc")    @RequiresRoles("admin")

spring security也提供了类似的功能,它从两个方面来提供的 1配置 2注解

1.配置形式的提供

我们这边有两个需要访问的资源

@RestController
public class AuthController {

  @GetMapping("/needAuth")
  public String needAuth(){
    return "具有权限访问";
  }

  @GetMapping("/needRole")
  public String needRole(){
    return "具有角色访问";
  }
}

  具体配置如下

protected void configure(HttpSecurity http) throws Exception {
    http.formLogin() //表单登录
            .loginPage("/login.html") //登录页面
            .loginProcessingUrl("/user/login") //登录访问路径,这个路径默认不需要认证
            .defaultSuccessUrl("/").permitAll()  //默认跳转路径,如果有指定路径,则它就可以忽略,这个测试结论是必须加,但是它没有默认效果,访问不存在的404,访问存在的就找真实地址,那它的默认意义又何在?
            .and().authorizeRequests()
                .antMatchers("/hello").permitAll() //设置哪些路径可以直接访问  permitAll这个不加还报错//.antMatchers("/needAuth").hasAuthority("auth")
                //.antMatchers("/needAuth").hasAnyAuthority("auth","auth2")
                //.antMatchers("/needRole").hasRole("admin")
                .antMatchers("/needRole").hasAnyRole("admin","admin2").anyRequest().authenticated() //剩下的请求都要认证.这个配置不加的话,所有路径都可以访问
            .and().csrf().disable();

  }

 权限的设置如下

public UserDetails loadUserByUsername(String userName) throws UsernameNotFoundException {
    QueryWrapper<Users> queryWrapper = new QueryWrapper();
    queryWrapper.eq("name",userName);

    Users user = usersMapper.selectOne(queryWrapper);
    if(user==null){
      throw new UsernameNotFoundException("用户不存在");
    }List<GrantedAuthority> list = AuthorityUtils.createAuthorityList("ROLE_admin","auth");return new User(user.getName(),new BCryptPasswordEncoder().encode(user.getPassword()),list);
  }

  分析一下:

1)两个角度,一个是权限角度Authority,一个是角色角度Role

2)  带有any的就是只要包含就能访问

3)role的处理比较特殊,在设置role的时候需要加上前缀ROLE_ 这是源码里面定义的

 

2.注解形式

上面的配置形式可能用的不多,实际中注解配置更广泛,就是把配置形式换成注解,内容完全一样

我们在资源上加上权限控制,做法就类似shiro了

@RestController
public class AuthController {

  @GetMapping("/needAuth")
  @PreAuthorize("hasAuthority('auth')")
  public String needAuth(){
    return "具有权限访问";
  }

  @GetMapping("/needRole")
  @PreAuthorize("hasAnyRole('admin')")
  public String needRole(){
    return "具有角色访问";
  }
}

  分析

1)红色部分有4种,我这里就写了2种,这4种和配置那边一模一样,等把配置那边换地方了

2)使用该注解形式必须开启注解

@SpringBootApplication
@MapperScan("com.example.demo.mapper")@EnableGlobalMethodSecurity(prePostEnabled = true)public class DemoApplication {

	public static void main(String[] args) {
		SpringApplication.run(DemoApplication.class, args);
	}

}

 

3.@Secured注解,有第二种了,这种不太建议使用

1)这个注解只提供对角色的使用

2)使用这个注解需要开启配置

@EnableGlobalMethodSecurity(prePostEnabled = true,securedEnabled = true)

3)在资源上可以这样

  @GetMapping("/needRole2")
  @Secured({"ROLE_admin","ROLE_admin2"})
  public String needRole2(){
    return "具有角色访问2";
  }

  注意:用户配置的权限是admin 上面注解的使用需要加上ROLE_开头,这个和之前的注解配置

     @PreAuthorize("hasAnyRole('admin')")有区别