一文搞定 Spring Boot & Shiro 实战

简介: Spring Boot集成Shiro权限验证框架,可参考:

Spring Boot集成Shiro权限验证框架,可参考:

https://shiro.apache.org/spring-boot.html

引入依赖

<dependency>
    <groupId>org.apache.shiro</groupId>
    <artifactId>shiro-spring-boot-web-starter</artifactId>
    <version>1.4.0</version>
</dependency>

配置Shiro

ShiroConfig

@ConfigurationProperties(prefix = "shiro")
@Configuration
public class ShiroConfig {
    @Autowired
    private ApplicationConfig applicationConfig;
    private List<String> pathDefinitions;
    @Bean
    public ShiroFilterChainDefinition shiroFilterChainDefinition() {
        DefaultShiroFilterChainDefinition chainDefinition = new
                DefaultShiroFilterChainDefinition();
        applicationConfig.getStaticDirs()
                .forEach(s -> chainDefinition.addPathDefinition(s, "anon"));
        this.getPathDefinitions().forEach(d -> {
            String[] defArr = d.split("=");
            chainDefinition
                    .addPathDefinition(StringUtils.trim(defArr[0]), StringUtils.trim(defArr[1]));
        });
        return chainDefinition;
    }
    @Bean
    public Realm systemRealm() {
        SystemRealm systemRealm = new SystemRealm();
        return systemRealm;
    }
    public List<String> getPathDefinitions() {
        return pathDefinitions;
    }
    public void setPathDefinitions(List<String> pathDefinitions) {
        this.pathDefinitions = pathDefinitions;
    }
}

ApplicationConfig:注入的是application.yml中的配置,略。

SystemRealm:

public class SystemRealm extends AuthorizingRealm {
    @Autowired
    private SysAdminMapper sysAdminMapper;
    @Override
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken)
            throws AuthenticationException {
        UsernamePasswordToken token = (UsernamePasswordToken) authenticationToken;
        token.setPassword(EcryptUtils.encode(String.valueOf(token.getPassword())).toCharArray
                ());
        SysAdminDO sysAdminParams = new SysAdminDO();
        sysAdminParams.setAdminLoginName(token.getUsername());
        SysAdminDO sysAdminDO = sysAdminMapper.selectByParams(sysAdminParams);
        AuthenticationInfo authInfo = null;
        if (sysAdminDO != null) {
            authInfo = new SimpleAuthenticationInfo(sysAdminDO, sysAdminDO.getAdminLoginPass(),
                    getName());
        }
        return authInfo;
    }
    @Override
    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
        /**
         * 下面为静态示例,根据用户对应权限进行修改
         * 根据用户查询对应的角色、权限
         */
        SysAdminDO sysAdminDO = (SysAdminDO) super.getAvailablePrincipal(principalCollection);
        SimpleAuthorizationInfo authorizationInfo = new SimpleAuthorizationInfo();
        Set<String> roles = new HashSet<>();
        roles.addAll(Arrays.asList("product", "operation"));
        authorizationInfo.setRoles(roles);
        Set<String> permissions = new HashSet<>();
        permissions.addAll(Arrays.asList("product:create", "product:del", "operation:update"));
        authorizationInfo.addStringPermissions(permissions);
        return authorizationInfo;
    }
}

应用配置

application.yml中加入Shiro配置。

shiro:
  loginUrl: /login
  successUrl: /
  unauthorizedUrl: /error
  pathDefinitions:
    - /login/submit = anon
    - /logout = logout
    - /test = authc, roles[product], perms[operation:update]
    - /** = authc

loginUrl:没有认证的将会跳到登录页面。


successUrl:认证成功跳转的页面。


unauthorizedUrl:认证失败跳转的页面。


pathDefinitions:用来定义路径授权规则。


更多参数参考官网定义:


https://shiro.apache.org/spring-boot.html#configuration-properties


登录服务类

@Override
public SysAdminDO login(LoginForm form) {
    UsernamePasswordToken token = new UsernamePasswordToken(form.getLoginName(),
            form.getLoginPassword());
    token.setRememberMe(true);
    Subject currentUser = getSubject();
    try {
        currentUser.login(token);
    } catch (Exception e) {
        logger.error("登录验证失败:", e);
    }
    return (SysAdminDO) currentUser.getPrincipal();
}

自带的过滤器

anno, authc等更多定义参考类:

org.apache.shiro.web.filter.mgt.DefaultFilter
相关文章
|
3月前
|
负载均衡 监控 Java
Spring Cloud Gateway 全解析:路由配置、断言规则与过滤器实战指南
本文详细介绍了 Spring Cloud Gateway 的核心功能与实践配置。首先讲解了网关模块的创建流程,包括依赖引入(gateway、nacos 服务发现、负载均衡)、端口与服务发现配置,以及路由规则的设置(需注意路径前缀重复与优先级 order)。接着深入解析路由断言,涵盖 After、Before、Path 等 12 种内置断言的参数、作用及配置示例,并说明了自定义断言的实现方法。随后重点阐述过滤器机制,区分路由过滤器(如 AddRequestHeader、RewritePath、RequestRateLimiter 等)与全局过滤器的作用范围与配置方式,提
Spring Cloud Gateway 全解析:路由配置、断言规则与过滤器实战指南
|
4月前
|
监控 Java API
Spring Boot 3.2 结合 Spring Cloud 微服务架构实操指南 现代分布式应用系统构建实战教程
Spring Boot 3.2 + Spring Cloud 2023.0 微服务架构实践摘要 本文基于Spring Boot 3.2.5和Spring Cloud 2023.0.1最新稳定版本,演示现代微服务架构的构建过程。主要内容包括: 技术栈选择:采用Spring Cloud Netflix Eureka 4.1.0作为服务注册中心,Resilience4j 2.1.0替代Hystrix实现熔断机制,配合OpenFeign和Gateway等组件。 核心实操步骤: 搭建Eureka注册中心服务 构建商品
811 3
|
5月前
|
安全 Java 数据库
第16课:Spring Boot中集成 Shiro
第16课:Spring Boot中集成 Shiro
814 0
|
2月前
|
监控 Cloud Native Java
Spring Boot 3.x 微服务架构实战指南
🌟蒋星熠Jaxonic,技术宇宙中的星际旅人。深耕Spring Boot 3.x与微服务架构,探索云原生、性能优化与高可用系统设计。以代码为笔,在二进制星河中谱写极客诗篇。关注我,共赴技术星辰大海!(238字)
Spring Boot 3.x 微服务架构实战指南
|
2月前
|
XML Java 测试技术
《深入理解Spring》:IoC容器核心原理与实战
Spring IoC通过控制反转与依赖注入实现对象间的解耦,由容器统一管理Bean的生命周期与依赖关系。支持XML、注解和Java配置三种方式,结合作用域、条件化配置与循环依赖处理等机制,提升应用的可维护性与可测试性,是现代Java开发的核心基石。
|
7月前
|
人工智能 Java API
Spring AI 实战|Spring AI入门之DeepSeek调用
本文介绍了Spring AI框架如何帮助Java开发者轻松集成和使用大模型API。文章从Spring AI的初探开始,探讨了其核心能力及应用场景,包括手动与自动发起请求、流式响应实现打字机效果,以及兼容不同AI服务(如DeepSeek、通义千问)的方法。同时,还详细讲解了如何在生产环境中添加监控以优化性能和成本管理。通过Spring AI,开发者可以简化大模型调用流程,降低复杂度,为企业智能应用开发提供强大支持。最后,文章展望了Spring AI在未来AI时代的重要作用,鼓励开发者积极拥抱这一技术变革。
2721 71
Spring AI 实战|Spring AI入门之DeepSeek调用
|
4月前
|
人工智能 监控 安全
如何快速上手【Spring AOP】?核心应用实战(上篇)
哈喽大家好吖~欢迎来到Spring AOP系列教程的上篇 - 应用篇。在本篇,我们将专注于Spring AOP的实际应用,通过具体的代码示例和场景分析,帮助大家掌握AOP的使用方法和技巧。而在后续的下篇中,我们将深入探讨Spring AOP的实现原理和底层机制。 AOP(Aspect-Oriented Programming,面向切面编程)是Spring框架中的核心特性之一,它能够帮助我们解决横切关注点(如日志记录、性能统计、安全控制、事务管理等)的问题,提高代码的模块化程度和复用性。
|
6月前
|
Cloud Native Java 微服务
Spring Boot 3.x 现代化应用开发实战技巧与最佳实践
本指南基于Spring Boot 3.x,融合微服务、云原生与响应式编程等前沿技术,打造现代化应用开发实践。通过构建智能电商平台案例,涵盖商品、订单、用户等核心服务,展示Spring WebFlux、OAuth 2.0认证、Spring Cloud Gateway路由、GraalVM原生编译等技术实现。同时提供Docker/Kubernetes部署方案及性能优化策略,助您掌握从开发到生产的全流程。代码示例详实,适合进阶开发者参考。
650 2