Spring Security使用方法注解概要

作者: adm 分类: java 发布时间: 2023-05-31

前文概要:

《入门案例》

《使用数据库》

《基于资源的认证和授权》
前文使用的资源定义方式都是基于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注解,而且首推基于资源进行设置。

如果觉得我的文章对您有用,请随意赞赏。您的支持将鼓励我继续创作!