package com.annotation; import java.lang.annotation.*; /** * 忽略Token验证 */ @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface IgnoreAuth { }这是干什么的 详细说明
这是一个自定义注解,用于在方法上标记忽略Token验证。通常在使用Token进行身份验证的系统中,需要对用户进行身份验证以保护系统安全,但有时候也会有一些不需要进行身份验证的接口,比如一些公开的查询接口或者登录接口。在这种情况下,就可以使用这个自定义注解来标记这些接口,以便在进行身份验证时忽略这些接口。
具体来说,这个注解是通过@Target、@Retention和@Documented三个元注解来定义的。@Target注解指定了这个注解可以被应用在方法上,@Retention注解指定了这个注解在运行时保留,@Documented注解指定了这个注解将会被包含在JavaDoc中。这样一来,当我们在编写代码时,就可以在需要忽略Token验证的方法上添加@IgnoreAuth注解,以便在进行身份验证时忽略这些方法。
sa token 数据权限
SA Token数据权限管理实现方式
1. 数据权限概述
数据权限控制是指针对特定业务对象(如订单、客户等),不同角色或用户可以访问不同的记录。通过SA Token,可以在应用层面灵活地实施细粒度的数据权限控制。
2. 自定义Token携带额外信息
为了支持数据级别的权限验证,可以通过扩展LoginUser
实体来保存用户的附加属性,比如部门ID、职位等级等。这些信息会在每次请求时被注入到当前会话中[^1]。
public class LoginUser {
private Integer id;
private String username;
private List<String> roles; // 用户的角色列表
private Long deptId; // 所属部门编号
public void setDeptId(Long deptId){
this.deptId = deptId;
}
public Long getDeptId(){
return this.deptId;
}
}
3. 动态加载资源映射表
创建一个服务接口用于获取指定模块下的所有可操作资源及其对应的操作类型(增删改查)。该功能通常由后台管理系统提供维护界面给管理员设置[^2]。
SELECT resource_id, module_name, action_code FROM sys_resources WHERE status='active';
4. 注解驱动的控制器层保护
利用Spring AOP切面编程技术配合自定义注解完成对API接口的数据级授权检查逻辑。例如:
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@interface DataPermission{
String value() default ""; // 可选参数表示具体字段名,默认为空字符串代表整个实体
}
@RestControllerAdvice
class GlobalExceptionHandler {
@Around("@annotation(dataPerm)")
Object around(ProceedingJoinPoint pjp,DataPermission dataPerm)throws Throwable{
StpUtil.checkRole("admin"); // 基本角色判断
// 获取目标方法上的注解值以及传入的对象实例
MethodSignature signature=(MethodSignature)pjp.getSignature();
Method method=signature.getMethod();
Class<?>[] paramTypes=method.getParameterTypes();
// 进一步处理...
return pjp.proceed();
}
}
5. SQL查询条件拼接
当执行数据库读取命令时,根据已登录用户的身份特征动态追加WHERE子句以限定返回的结果集范围。这一步骤往往是在DAO层内部完成的。
if (StpUtil.isLogin()){
userId = StpUtil.getLoginIdAsInt();
}else{
throw new UnauthorizedException("未登录");
}
// 构建SQL语句中的where部分
StringBuilder whereClause=new StringBuilder(" AND creator_id=? ");
List<Object> params=new ArrayList<>();
params.add(userId);
return jdbcTemplate.queryForList(sql.toString(),params.toArray());
spring security怎么通过自定义注解+aop实现配置指定接口不用token就能访问
要通过自定义注解和AOP来实现Spring Security配置指定接口不需要Token才能访问,可以按照以下步骤进行操作:
- 创建一个自定义注解,例如
@NoTokenRequired
,用于标识不需要Token的接口。
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface NoTokenRequired {
}
- 创建一个切面类,用于拦截带有
@NoTokenRequired
注解的方法,并跳过Spring Security的Token验证。
@Aspect
@Component
public class TokenValidationAspect {
@Before("@annotation(com.example.NoTokenRequired)")
public void skipTokenValidation(JoinPoint joinPoint) {
// 跳过Spring Security的Token验证逻辑
SecurityContextHolder.getContext().setAuthentication(null);
}
}
- 配置Spring Security,将AOP切面类添加到Spring Security的配置中。
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
private TokenValidationAspect tokenValidationAspect;
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
// 配置需要Token验证的接口
.anyRequest().authenticated()
.and()
.csrf().disable();
// 将AOP切面类添加到Spring Security的配置中
http.addFilterBefore(tokenValidationAspect, UsernamePasswordAuthenticationFilter.class);
}
}
- 在需要不需要Token验证的接口上,添加
@NoTokenRequired
注解。
@RestController
public class ExampleController {
@NoTokenRequired
@GetMapping("/example")
public String example() {
return "This API does not require Token";
}
}
这样配置之后,带有@NoTokenRequired
注解的接口将不会进行Spring Security的Token验证,即可在没有Token的情况下访问该接口。其他接口仍然需要进行Token验证。
相关推荐














