@PermitAll注解和@PreAuthorize注解

@PermitAll

Spring Security中的@PermitAll注解‌是一个标记注解,用于指示一个特定的类或方法可以被任何用户访问,无论用户是否经过身份验证或拥有任何特定的角色。这个注解通常用于那些不需要进行权限校验的接口或方法上

例如公开的API端点或主页,希望任何人都能访问,可以使用@PermitAl注解


@RestController
public class PublicApiController {
    @PermitAll
    @GetMapping("/public/data")
    public ResponseEntity<String> getPublicData() {
        return ResponseEntity.ok("这是公开数据, 任何人都可以访问。");
    }
}

在Spring Security中,@PermitAll注解可以应用于Controller层的方法上,表示该方法所对应的URL可以被所有用户访问,无需进行权限校验

@RestController
public class UserController {
    @PermitAll
    @GetMapping("/api/public")
    public String publicMethod() {
        return "这是公开的方法";
    }
}

在这个例子中,publicMethod()方法使用了@PermitAll注解,意味着无论用户是否具有相应的权限,都可以访问/api/public路径‌

@PreAuthorize 注解

在开源项目中但凡使用了Spring Security框架的总会在部分接口上看到这个方法

很明显这是个创建用户的接口,我们都能看出这个注解的大致意思,就是判断登录的人是否有添加权限
下面来详细说明一下@ss.hasPermission(‘visit:questionnaire:query’)是什么意思,怎么用的
首先,@PreAuthorize是 Spring Security 内置的前置权限注解,添加在接口方法上,声明需要的权限,实现访问权限的控制。
实现原理:

当 @PreAuthorize 注解里的 Spring EL 表达式返回 false 时,表示没有权限。
而 @PreAuthorize(“@ss.hasPermission(‘visit:questionnaire:query’)”) 表示调用 Bean 名字为 ss 的 hasPermission(…) 方法,方法参数为"visit:questionnaire:query" 字符串。

所以你只需要找到在哪儿创建的Bean,并且Bean的名字是ss,就知道这个方法到底是怎么实现的了

### @PreAuthorize 导致 403 Forbidden 错误解决方案 当遇到 `@PreAuthorize` 注解导致的 403 Forbidden 错误时,通常是因为 Spring Security 的配置或表达式的设置不正确。以下是几种常见的原因及其对应的解决方案: #### 配置全局方法安全性 确保已启用全局方法安全性。这可以通过在主类或其他配置类上添加 `@EnableGlobalMethodSecurity(prePostEnabled = true)` 来实现[^2]。 ```java @Configuration @EnableWebSecurity @EnableGlobalMethodSecurity(prePostEnabled = true) public class WebSecurityConfig extends WebSecurityConfigurerAdapter { // ... } ``` #### 检查角色前缀 默认情况下,Spring Security 使用 "ROLE_" 前缀来匹配角色名称。如果数据库中的角色名没有这个前缀,则需要调整 SpEL 表达式以去除该前缀。 ```java @PreAuthorize("hasRole('USER')") // 如果实际存储的角色名为 'USER' // 或者更灵活的方式: @PreAuthenticate("hasAuthority('ROLE_USER')") ``` #### 调试SpEL表达式 有时复杂的 SpEL (Spring Expression Language) 可能会因为语法错误而失败。可以尝试简化条件逻辑并逐步增加复杂度直到找到问题所在。另外,在开发环境中开启调试日志可以帮助定位具体哪一步出现了问题[^1]。 ```properties logging.level.org.springframework.security=DEBUG ``` #### 排除静态资源路径 对于不需要保护的静态文件夹(如 CSS, JS),应该将其排除在外以免意外触发安全拦截器造成不必要的麻烦。 ```java @Override protected void configure(HttpSecurity http) throws Exception { http.authorizeRequests() .antMatchers("/css/**", "/js/**").permitAll() // 放行指定目录下的请求 // ...其他规则... ; } ``` #### 测试用户身份验证状态 确认当前登录用户的凭证确实包含了满足策略所需的权限信息。可通过编写简单的控制器端点返回当前主体详情来进行快速验证。 ```java @GetMapping("/user-info") @ResponseBody public Principal userInfo(Principal principal){ return principal; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值