美文网首页
Spring Security使用方法注解概要

Spring Security使用方法注解概要

作者: 文景大大 | 来源:发表于2021-08-02 17:14 被阅读0次

    前文概要:

    《入门案例》

    《使用数据库》

    《基于资源的认证和授权》

    前文使用的资源定义方式都是基于Web的方式,即在WebSecurityConfigurerAdapter中进行配置的,好处就是对代码没有侵入,我们无需在每个Controller的方法上去加上注解。但是缺点也很明显,万一需要对很多单个的URL进行权限配置,那么该类中就会有很多配置代码,会显得臃肿。

    所以Spring Security还提供了方法注解的方式来对资源进行权限的定义。如果要开启方法注解,那么就需要改造我们的WebSecurityConfigurerAdapter类,对需要的注解种类设置开启。

    @EnableWebSecurity
    @EnableGlobalMethodSecurity(prePostEnabled = true, securedEnabled = true, jsr250Enabled = true)
    public class MyDBSecurityConfig extends WebSecurityConfigurerAdapter {
    
        @Autowired
        private UserService userService;
    
        @Bean
        @Override
        public AuthenticationManager authenticationManagerBean() throws Exception {
            return super.authenticationManagerBean();
        }
    
        @Override
        protected void configure(AuthenticationManagerBuilder auth) throws Exception {
            auth.userDetailsService(userService);
        }
    
        /**
         * 默认开启密码加密,前端传入的密码Security会在加密后和数据库中的密文进行比对,一致的话就登录成功
         * 所以必须提供一个加密对象
         * @return
         */
        @Bean
        PasswordEncoder passwordEncoder() {
            return new BCryptPasswordEncoder();
        }
    
    }
    

    以上三种注解的开关默认都是关闭的,所以需要使用者指定哪一种的需要开启。同时由于我们使用方法注解来完成资源权限的定义,所以原先基于Web方式的资源权限定义代码就不需要了,已经删除。

    一、JSR-250注解

    JSR(Java Specification Request)是一种Java中注解的规范,比如JSR-175、JSR-250、JSR-330。其中JSR-250是针对资源权限的注解规范,比如@Bean、@Resource、@PostConstruct、@PreDestroy等,这些注解都在Spring中得到了实现。

    较常使用的注解有:

    • @DenyAll,拒绝所有角色对该资源的访问;
    • @PermitAll,允许所有角色对该资源的访问;
    • @RolesAllowed,允许指定的角色对该资源的访问;

    我们给个实际的案例看下:

    @RestController
    public class MyUserController {
        @GetMapping("/addUser2")
        @RolesAllowed({"admin"})
        public String addUser2() {
            return "add user success!";
        }
    
        @GetMapping("/deleteUser2")
        // 角色可以省略ROLE_前缀,也可以不省略,效果一样
        @RolesAllowed({"admin", "manager"})
        public String deleteUser2() {
            return "delete user success!";
        }
    }
    

    在实际开发中,比较推荐使用prePostEnabled注解,不太常用JSR-250注解,其只支持基于角色,不能支持基于资源。

    二、securedEnabled注解

    @Secured注解也是只能支持基于角色的访问控制,而且必须要加上ROLE_前缀。

    @RestController
    public class MyUserController {
    
        @GetMapping("/addUser3")
        @Secured({"ROLE_admin"})
        public String addUser3() {
            return "add user success!";
        }
    
        @GetMapping("/deleteUser3")
        @Secured({"ROLE_admin", "ROLE_manager"})
        public String deleteUser3() {
            return "delete user success!";
        }
    
    }
    

    在实际开发中,比较推荐使用prePostEnabled注解,不太常用securedEnabled注解。

    三、prePostEnabled注解

    prePostEnabled注解是可以同时支持基于角色和基于资源的访问控制的。

    @RestController
    public class MyUserController {
    
        @GetMapping("/addUser4")
        @PreAuthorize("hasAuthority('user:add')")
        public String addUser4() {
            return "add user success!";
        }
    
        @GetMapping("/deleteUser4")
        @PreAuthorize("hasAuthority('user:delete')")
        public String deleteUser4() {
            return "delete user success!";
        }
    
        @GetMapping("/addUser5")
        @PreAuthorize("hasRole('admin')")
        public String addUser5() {
            return "add user success!";
        }
    
        @GetMapping("/deleteUser5")
        @PreAuthorize("hasRole('admin') or hasRole('manager')")
        public String deleteUser5() {
            return "delete user success!";
        }
    
    }
    

    在实际开发中,比较推荐使用prePostEnabled注解,而且首推基于资源进行设置。

    相关文章

      网友评论

          本文标题:Spring Security使用方法注解概要

          本文链接:https://www.haomeiwen.com/subject/caqjvltx.html