✨ 通过编程方式授权方法
This commit is contained in:
parent
459739b212
commit
24caac4b00
|
@ -1080,6 +1080,10 @@ public Report getReport(Long id) { ... }
|
||||||
|
|
||||||
**自定义Any模板元注解**
|
**自定义Any模板元注解**
|
||||||
|
|
||||||
|
> [!WARNING]
|
||||||
|
>
|
||||||
|
> SpringSecurity6.3.10版本与最新版的6.5.1写法不一样。
|
||||||
|
|
||||||
如果需要自定义任意权限都可通过需要引入下面的内容。
|
如果需要自定义任意权限都可通过需要引入下面的内容。
|
||||||
|
|
||||||
```java
|
```java
|
||||||
|
@ -1206,4 +1210,31 @@ public class AuthTestController {
|
||||||
public Content getContent(Long id) {
|
public Content getContent(Long id) {
|
||||||
// 需要管理员权限且只允许返回公开内容
|
// 需要管理员权限且只允许返回公开内容
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
## 通过编程方式授权方法
|
||||||
|
|
||||||
|
```java
|
||||||
|
@Component("auth")
|
||||||
|
public class AuthorizationLogic {
|
||||||
|
|
||||||
|
public boolean decide(String name) {
|
||||||
|
System.out.println(name);
|
||||||
|
// 直接使用name的实现
|
||||||
|
return name.equalsIgnoreCase("user");
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
在控制器中使用
|
||||||
|
|
||||||
|
```java
|
||||||
|
@PreAuthorize("@auth.decide(#name)")
|
||||||
|
@Operation(summary = "拥有 USER 的角色可以访问", description = "当前用户拥有 USER 角色可以访问这个接口")
|
||||||
|
@GetMapping("lower-user")
|
||||||
|
public Result<String> lowerUser(String name) {
|
||||||
|
return Result.success(name);
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,32 @@
|
||||||
|
package com.spring.step2.controller.test;
|
||||||
|
|
||||||
|
import com.spring.step2.domain.vo.result.Result;
|
||||||
|
import io.swagger.v3.oas.annotations.Operation;
|
||||||
|
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.springframework.security.access.prepost.PreAuthorize;
|
||||||
|
import org.springframework.web.bind.annotation.GetMapping;
|
||||||
|
import org.springframework.web.bind.annotation.RequestMapping;
|
||||||
|
import org.springframework.web.bind.annotation.RestController;
|
||||||
|
|
||||||
|
@Tag(name = "Programmatically", description = "只要包含 Programmatically 角色都可以访问")
|
||||||
|
@Slf4j
|
||||||
|
@RestController
|
||||||
|
@RequestMapping("/api/security/programmatically")
|
||||||
|
public class SecurityProgrammaticallyController {
|
||||||
|
|
||||||
|
@Operation(summary = "拥有 USER 的角色可以访问", description = "当前用户拥有 USER 角色可以访问这个接口")
|
||||||
|
@GetMapping("upper-user")
|
||||||
|
public Result<String> upperUser() {
|
||||||
|
String data = "是区分大小写的";
|
||||||
|
return Result.success(data);
|
||||||
|
}
|
||||||
|
|
||||||
|
@PreAuthorize("@auth.decide(#name)")
|
||||||
|
@Operation(summary = "拥有 USER 的角色可以访问", description = "当前用户拥有 USER 角色可以访问这个接口")
|
||||||
|
@GetMapping("lower-user")
|
||||||
|
public Result<String> lowerUser(String name) {
|
||||||
|
return Result.success(name);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,14 @@
|
||||||
|
package com.spring.step2.security.annotation.programmatically;
|
||||||
|
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
|
@Component("auth")
|
||||||
|
public class AuthorizationLogic {
|
||||||
|
|
||||||
|
public boolean decide(String name) {
|
||||||
|
System.out.println(name);
|
||||||
|
// 直接使用name的实现
|
||||||
|
return name.equalsIgnoreCase("user");
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -14,6 +14,32 @@ import org.springframework.security.provisioning.InMemoryUserDetailsManager;
|
||||||
@Configuration
|
@Configuration
|
||||||
public class SecurityConfiguration {
|
public class SecurityConfiguration {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 注册一个用于Spring Security预授权/后授权的模板元注解默认配置Bean。
|
||||||
|
*
|
||||||
|
* <p>该Bean提供了基于SpEL表达式的权限校验模板,可用于自定义组合注解。</p>
|
||||||
|
*
|
||||||
|
* <h3>典型用法</h3>
|
||||||
|
* <p>通过此配置可以简化自定义权限注解的定义,例如:</p>
|
||||||
|
* <pre>{@code
|
||||||
|
* @Target({ElementType.METHOD, ElementType.TYPE})
|
||||||
|
* @Retention(RetentionPolicy.RUNTIME)
|
||||||
|
* @PreAuthorize("hasAnyAuthority( // 使用模板提供的表达式语法
|
||||||
|
* public @interface HasAnyAuthority {
|
||||||
|
* String[] auth(); // 接收权限列表参数
|
||||||
|
* }
|
||||||
|
* }</pre>
|
||||||
|
*
|
||||||
|
* <h3>注意事项</h3>
|
||||||
|
* <ul>
|
||||||
|
* <li>需要确保Spring Security的预授权功能已启用</li>
|
||||||
|
* <li>模板表达式应符合SpEL语法规范</li>
|
||||||
|
* </ul>
|
||||||
|
*
|
||||||
|
* @return PrePostTemplateDefaults 实例,用于预/后授权注解的默认配置
|
||||||
|
* @see org.springframework.security.access.prepost.PreAuthorize
|
||||||
|
* @see org.springframework.security.access.prepost.PostAuthorize
|
||||||
|
*/
|
||||||
@Bean
|
@Bean
|
||||||
PrePostTemplateDefaults prePostTemplateDefaults() {
|
PrePostTemplateDefaults prePostTemplateDefaults() {
|
||||||
return new PrePostTemplateDefaults();
|
return new PrePostTemplateDefaults();
|
||||||
|
|
Loading…
Reference in New Issue