其他分享
首页 > 其他分享> > 5.资源访问的权限控制

5.资源访问的权限控制

作者:互联网

我们在学习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_ 这是源码里面定义的



标签:needAuth,antMatchers,访问,user,new,权限,public,资源
来源: https://www.cnblogs.com/johnzhao/p/14527315.html