【SpringSecurity】使用注解方式实现匿名访问

SpringSecurity实现匿名访问的方式如下,

/**
 * spring security配置
 * {@link EnableGlobalMethodSecurity } 如果想要启用spring方法级安全时,使用这个注解
 *
 * @author ruoyi
 */
@EnableGlobalMethodSecurity(prePostEnabled = true, securedEnabled = true)
public class SecurityConfig extends WebSecurityConfigurerAdapter {  
    
    @Override
    protected void configure(HttpSecurity httpSecurity) throws Exception {
        httpSecurity                
                .authorizeRequests()
                // 对于登录login 验证码captchaImage 允许匿名访问
                .antMatchers("/login", "/captchaImage").anonymous();
    }
}

如果有很多个路径都需要匿名访问,那岂不是要在 antMatchers 加很多路径?这样太繁琐

使用注解方式实现匿名访问,步骤如下

  1. 先定义一个注解
/**
 * Security允许匿名访问
 */
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface AnonymousAccess {
}
  1. 修改 security 配置类
/**
 * spring security配置
 * {@link EnableGlobalMethodSecurity } 如果想要启用spring方法级安全时,使用这个注解
 *
 * @author ruoyi
 */
@EnableGlobalMethodSecurity(prePostEnabled = true, securedEnabled = true)
public class SecurityConfig extends WebSecurityConfigurerAdapter {  
    
    @Override
    protected void configure(HttpSecurity httpSecurity) throws Exception {
        httpSecurity                
                .authorizeRequests()
                // 对于登录login 验证码captchaImage 允许匿名访问
                .antMatchers("/login", "/captchaImage").anonymous()
                // 所有加 AnonymousAccess 注解的请求都允许匿名访问
                .antMatchers(getAnonymousUrls()).anonymous();
    }

	/**
     * 获取标有注解 AnonymousAccess 的访问路径
     */
    private String[] getAnonymousUrls() {
        // 获取所有的 RequestMapping
        Map<RequestMappingInfo, HandlerMethod> handlerMethods = SpringUtils.getBean(RequestMappingHandlerMapping.class).getHandlerMethods();
        Set<String> allAnonymousAccess = new HashSet<>();
        // 循环 RequestMapping
        for (Map.Entry<RequestMappingInfo, HandlerMethod> infoEntry : handlerMethods.entrySet()) {
            HandlerMethod value = infoEntry.getValue();
            // 获取方法上 AnonymousAccess 类型的注解
            AnonymousAccess methodAnnotation = value.getMethodAnnotation(AnonymousAccess.class);
            // 如果方法上标注了 AnonymousAccess 注解,就获取该方法的访问全路径
            if (methodAnnotation != null) {
                allAnonymousAccess.addAll(infoEntry.getKey().getPatternsCondition().getPatterns());
            }
        }
        return allAnonymousAccess.toArray(new String[0]);
    }
}
  1. 使用
@RestController
@RequestMapping("/consignment")
public class RmbssDcDepotController extends BaseController {

    @Autowired
    private IRmbssDcDepotService rmbssDcDepotService;

    /**
     * 查询所有有效的代储车间
     * @AnonymousAccess 允许匿名访问的注解
     */
    @AnonymousAccess 
    @GetMapping("/plantList")
    public AjaxResult plantList(RmbssDcDepot rmbssDcDepot) {
        return AjaxResult.success(rmbssDcDepotService.selectDcPlantList(rmbssDcDepot));
    }
}
Spring Security是一个功能强大且灵活的身份验证和访问控制框架,用于保护基于Java的应用程序。它提供了一套全面的安全解决方案,可用于保护Web应用程序、RESTful API、方法级别的安全等。 Spring Security的核心原则是基于拦截器链(Filter Chain)的安全性,它通过一系列的过滤器(Filters)来处理不同的安全问题。这些过滤器可以在认证(Authentication)和授权(Authorization)过程中执行各种任务。 在Spring Security中,认证是指验证用户的身份,通常通过用户名和密码进行验证。授权是指根据用户的身份和角色来确定其是否有权访问特定资源或执行特定操作。 Spring Security提供了许多功能和扩展点,可以轻松地自定义和扩展以满足特定的需求。以下是一些Spring Security的主要功能: 1. 身份验证(Authentication):Spring Security支持多种身份验证方式,如基于数据库、LDAP、OAuth等。它还提供了记住我(Remember Me)和匿名访问等功能。 2. 授权(Authorization):Spring Security支持基于角色和权限的授权机制。可以配置细粒度的访问控制规则,以确保只有具有合适权限的用户可以访问受保护的资源。 3. 安全性注解Security Annotations):Spring Security提供了一套注解,可以在方法级别上标记安全性要求。这些注解可以用于限制对特定方法的访问,并进行细粒度的授权控制。 4. CSRF保护(CSRF Protection):Spring Security提供了一种防止跨站请求伪造(CSRF)攻击的机制。它通过生成和验证CSRF令牌来确保只有合法的请求才能被处理。 5. Session管理(Session Management):Spring Security提供了对会话管理的支持,包括会话过期、并发控制和无效会话处理等功能。 6. 安全事件与日志(Security Events and Logging):Spring Security可以生成安全相关的事件,并提供了灵活的日志配置选项,以便记录和监视应用程序的安全状态。 以上只是Spring Security的一些主要功能,它还有很多其他特性和扩展点可用于满足各种安全需求。要详细了解Spring Security使用和配置,可以参考官方文档或其他相关资源。
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值