我们在学习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')")有区别