SpringBoot集成SpringSecurity ------权限控制

SpringBoot集成SpringSecurity ------权限控制

Scroll Down

Spring Security权限控制可以配合授权注解使用,开启注解,需要在Security的配置文件上配置:

@Configuration
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
}

在CustomUserDetailsServiceImpl 中,给与当前登录用户登录权限,当用户名是admin时,权限为admin,其它权限为user权限:

@Configuration
public class CustomUserDetailsServiceImpl implements UserDetailsService {

    @Autowired
    private PasswordEncoder passwordEncoder;

    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        // 模拟一个用户存储数据(代替从数据库里面查询的数据)
        UserInfouser = new UserInfo();
        user.setUserName(username);
        //使用Security默认的加密方式
        user.setPassword(this.passwordEncoder.encode("123456"));

        List<GrantedAuthority> authorities = new ArrayList<>();
        if (StringUtils.equalsIgnoreCase("admin", username)) {
            authorities = AuthorityUtils.commaSeparatedStringToAuthorityList("admin");
        } else {
            authorities = AuthorityUtils.commaSeparatedStringToAuthorityList("user");
        }

        return new User(username, user.getPassword(), user.isEnabled(),
                user.isAccountNonExpired(), user.isCredentialsNonExpired(),
                user.isAccountNonLocked(), authorities );
    }
}

在控制层添加方法权限注释表明,只有 "admin"权限的人才能访问:

  @RequestMapping("/helloAdmin")
    @PreAuthorize("hasRole('ROLE_ADMIN')")
    @ResponseBody
    public String helloAdmin(){
        return "登录用户,具备 ADMIN  权限";
    }

当时用admin用户权限登录时,显示页面:
W5`IDBA28OZ6YB~UCNBQ.png

当其他用户权限访问时,出现403错误:
3.png

可以看出,没有admin权限造成的。
所以可以自定义权限不足处理器来处理权限不足时候的问题:

新增一个处理器 CustomAuthenticationAccessDeniedHandler ,实现 AccessDeniedHandler

@Component
public class CustomAuthenticationAccessDeniedHandler implements AccessDeniedHandler {

    @Override
    public void handle(HttpServletRequest request, HttpServletResponse response, AccessDeniedException accessDeniedException) throws IOException {
        response.setStatus(HttpStatus.INTERNAL_SERVER_ERROR.value());
        response.setContentType("application/json;charset=utf-8");
        response.getWriter().write("很抱歉,您没有该访问权限");
    }
}

然后将这个处理器添加到Spring Security配置链中:

 @Autowired
 private CustomAuthenticationAccessDeniedHandler authenticationAccessDeniedHandler;

 @Override
protected void configure(HttpSecurity http) throws Exception {
    http.exceptionHandling()
            .accessDeniedHandler(authenticationAccessDeniedHandler)
        .and()
    ......
}

再次访问,则会提示没有权限的信息。

权限继承

在系统中,例如有admin用户,user用户。admin用户可以查看权限为admin 和 user的信息,user用户只能查看user权限的信息,这时需要在Security的配置文件中添加:

  @Bean
    RoleHierarchy roleHierarchy(){
        RoleHierarchyImpl roleHierarchy = new RoleHierarchyImpl();
        String hierarchy = "ROLE_DBA > ROLE_ADMIN \n ROLE_ADMIN > ROLE_USER";
        roleHierarchy.setHierarchy(hierarchy);
        return roleHierarchy;
    }