SpringBoot整合shiro的一个完整的小案例

2023-05-16

SpringBoot整合配置版的shiro很简单,逻辑清
首先在pom.xml的配置如下,shiro使用缓存ehcache

        <dependency>
            <groupId>net.sf.ehcache</groupId>
            <artifactId>ehcache</artifactId>
            <version>2.10.4</version>
        </dependency>
        <!-- shiro spring. -->
        <dependency>
            <groupId>org.apache.shiro</groupId>
            <artifactId>shiro-core</artifactId>
            <version>1.2.2</version>
        </dependency>
        <dependency>
            <groupId>org.apache.shiro</groupId>
            <artifactId>shiro-spring</artifactId>
            <version>1.2.2</version>
        </dependency>
        <!-- shiro ehcache -->
        <dependency>
            <groupId>org.apache.shiro</groupId>
            <artifactId>shiro-ehcache</artifactId>
            <version>1.2.2</version>
        </dependency>

接着配置shiro

@Configuration
public class ShiroConfig {

    @Bean  
    public ShiroFilterFactoryBean shirFilter(DefaultWebSecurityManager securityManager) {  

        ShiroFilterFactoryBean shiroFilter = new ShiroFilterFactoryBean();  
        // 必须设置 SecurityManager  
        shiroFilter.setSecurityManager(securityManager);  
        // 拦截器  
        Map<String, String> filterChainDefinitionMap = new LinkedHashMap<String, String>();  
        // 设置login URL  
        shiroFilter.setLoginUrl("/login");  
        // 登录成功后要跳转的链接  
        shiroFilter.setSuccessUrl("/main");  
        filterChainDefinitionMap.put("/webjars/**", "anon");
        filterChainDefinitionMap.put("/druid/**", "anon");
        //静态资源的处理
        filterChainDefinitionMap.put("/js/**", "anon");
        filterChainDefinitionMap.put("/css/**", "anon");
        filterChainDefinitionMap.put("/asserts/**", "anon");
        filterChainDefinitionMap.put("/fonts/**", "anon");
        filterChainDefinitionMap.put("/images/**", "anon");

        // 退出系统的过滤器  
        filterChainDefinitionMap.put("/logout", "logout");
        filterChainDefinitionMap.put("/login", "anon"); 

        filterChainDefinitionMap.put("/kaptcha", "anon");

        filterChainDefinitionMap.put("/**", "authc");  
        shiroFilter.setFilterChainDefinitionMap(filterChainDefinitionMap);  
        return shiroFilter;  
    }  

    @Bean  
    public HashedCredentialsMatcher hashedCredentialsMatcher() {  
        HashedCredentialsMatcher hashedCredentialsMatcher = new HashedCredentialsMatcher();  
        hashedCredentialsMatcher.setHashAlgorithmName("MD5");
        hashedCredentialsMatcher.setHashIterations(1024);
        return hashedCredentialsMatcher;  
    }  

    @Bean
    public ShiroRealm shiroRealm(HashedCredentialsMatcher hashedCredentialsMatcher) {
        ShiroRealm shiroRealm = new ShiroRealm();
        shiroRealm.setCredentialsMatcher(hashedCredentialsMatcher);
        return shiroRealm;
    }
    //shiro使用缓存ehcachae
    @Bean
    public EhCacheManager ehCacheManager() {
        EhCacheManager ehCacheManager = new EhCacheManager();
        ehCacheManager.setCacheManagerConfigFile("classpath:ehcache.xml");
        return ehCacheManager;

    }

    @Bean("sessionManager")
    public SessionManager sessionManager(){
        DefaultWebSessionManager sessionManager = new DefaultWebSessionManager();
        sessionManager.setSessionValidationSchedulerEnabled(true);
        sessionManager.setSessionIdCookieEnabled(true);
        return sessionManager;
    }

    @Bean("securityManager")
    public DefaultWebSecurityManager securityManager(ShiroRealm shiroRealm, SessionManager sessionManager) {
        DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
        securityManager.setRealm(shiroRealm);
        securityManager.setSessionManager(sessionManager);

        return securityManager;
    }

    @Bean("lifecycleBeanPostProcessor")
    public LifecycleBeanPostProcessor lifecycleBeanPostProcessor() {
        return new LifecycleBeanPostProcessor();
    }

    @Bean
    public DefaultAdvisorAutoProxyCreator defaultAdvisorAutoProxyCreator() {
        DefaultAdvisorAutoProxyCreator proxyCreator = new DefaultAdvisorAutoProxyCreator();
        proxyCreator.setProxyTargetClass(true);
        return proxyCreator;
    }

    @Bean
    public AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor(SecurityManager securityManager) {
        AuthorizationAttributeSourceAdvisor advisor = new AuthorizationAttributeSourceAdvisor();
        advisor.setSecurityManager(securityManager);
        return advisor;
    }
}

在配置中提到的realm如下配置


public class ShiroRealm extends AuthorizingRealm {
    @Autowired
    private UserService userService;

    @Override
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
        UsernamePasswordToken upToken = (UsernamePasswordToken) token;
        // 取出表单用户名
        String username = upToken.getUsername();
        // 查询是否有该用户
        if (userService.getByName(username) == null) {
            throw new UnknownAccountException("用户不存在!");
        }
        // 靠用户名从数据库查询该用户的全部信息
        User user = userService.getByName(username);
        // 传入:用户名,加密后的密码,盐值,该realm的名字,加密算法和加密次数在已经在配置文件中指定
        SimpleAuthenticationInfo info = new SimpleAuthenticationInfo(username, user.getPassword(),
                ByteSource.Util.bytes(username), getName());
        return info;
    }

    @Override
    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
        // 1. 从 PrincipalCollection 中来获取登录用户的信息
        Object principal = principals.getPrimaryPrincipal();
        // 2. 利用登录的用户的信息来..当前用户的角色或权限(可能需要查询数据库)
        Set<String> roles = new HashSet<String>();
        roles.add("user");
        if ("admin".equals(principal)) {
            roles.add("admin");
        }
        // 3. 创建 SimpleAuthorizationInfo, 并设置其 reles 属性
        SimpleAuthorizationInfo info = new SimpleAuthorizationInfo(roles);
        // 4. 返回 SimpleAuthorizationInfo 对象.
        return info;
    }

}

由于我做的平台只有一个管理员就不写注册了,这时手动算出一个admin用户的密码

    public static void main(String[] args) {

        Object result = new SimpleHash("MD5","123456",ByteSource.Util.bytes("admin"),1024);
        System.out.println(result);
    }

最后写登录的Controller

@Controller
public class LoginController {
    // 处理登录逻辑
    @PostMapping("/login")
    public String login(String username, String password, String kaptcha, HttpSession session,
            Map<String, Object> map) {
        Subject currentUser = SecurityUtils.getSubject();
        if (!currentUser.isAuthenticated()) {
            // 把用户名和密码封装为 UsernamePasswordToken 对象
            UsernamePasswordToken token = new UsernamePasswordToken(username, password);
            // 设置为rememberme
            token.setRememberMe(true);
            try {
                // 执行登录.
                currentUser.login(token);
            }
            // 所有认证时异常的父类
            catch (AuthenticationException ae) {
                map.put("password", "输入的用户名或密码错误");
                log.info("登录失败: " + ae.getMessage());
                return "login";
            }
        }
        if (!session.getAttribute("code").equals(kaptcha)) {
            map.put("kaptcha", "输入的验证码错误");
            return "login";
        }

        session.setAttribute("loginUser", "user");
        return "main";

    }

}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SpringBoot整合shiro的一个完整的小案例 的相关文章

随机推荐

  • 动手学深度学习——7. CNN可视化

    动手学深度学习 7 CNN可视化 记录一下学习深度学习的一些 本篇记录一下使用 Grad CAM 可视化 CNN 环境 xff1a Windows 108700K2070Pytorch 1 7 1 深度学习在很多任务上 xff0c 特别是计
  • 动手学深度学习——8. 人物肖像画

    动手学深度学习 8 人物肖像画 记录一下学习深度学习的一些 本篇记录一下使用 U 2 Net paper 生成人物肖像画 xff0c 还有 APDrawingGAN 环境 xff1a Windows 108700K2070Pytorch 1
  • python函数--enumerate()方法

    enumerate 方法 描述 enumerate 函数用于将一个可遍历的数据对象 如列表 元组或字符串 组合为一个索引序列 xff0c 同时列出数据和数据下标 xff0c 一般用在 for 循环当中 Python 2 3 以上版本可用 x
  • [HAL库学习之路]1.点亮LED

    记录自己的STM32的HAL库的学习之路 xff0c 不定期更新 一 创建工程 二 Pinout 三 Clock Configuration 四 Configuration 配置GPIO的模式 速度等等 五 Generate Code Pr
  • [HAL库学习之路]5.IWDG-独立看门狗

    记录自己的STM32的HAL库的学习之路 xff0c 不定期更新 一 Pinout 二 Clock Configuration 三 Configuration 配置GPIO 配置IWDG 四 Generate Code 代码 主函数首先点亮
  • [HAL库学习之路]7.定时器中断

    记录自己的STM32的HAL库的学习之路 xff0c 不定期更新 一 Pinout 二 Clock Configuration 三 Configuration 定时器溢出时间 T o u t 61 a r r 43 1 p s c 43 1
  • [HAL库学习之路]8.PWM输出

    记录自己的STM32的HAL库的学习之路 xff0c 不定期更新 一 Pinout 二 Clock Configuration 三 Configuration 四 Generate Code 代码 span class hljs keywo
  • [HAL库学习之路]9.输入捕获

    记录自己的STM32的HAL库的学习之路 xff0c 不定期更新 一 Pinout 二 Clock Configuration 三 Configuration 四 Generate Code 代码 计数频率为1MHz xff0c 捕获到高电
  • [HAL库学习之路]11.RTC-实时时钟

    记录自己的STM32的HAL库的学习之路 xff0c 不定期更新 一 Pinout 二 Clock Configuration 三 Configuration 四 Generate Code 代码 int span class hljs f
  • 数字电路基础(四) 数据分配器、数据选择器和数值比较器

    数字电路基础 xff08 四 xff09 数据分配器 数据选择器和数值比较器 一 数据分配器 在数据传输的过程中 xff0c 数据选择器可以把某一路的数据分配到不同的数据通道上 xff0c 这种电路称为数据分配器 简称DEMUX xff0c
  • 好心博主祝您解决sql右模糊匹配一个列表的问题

    LambdaQueryWrapper if span class token punctuation span CollectionUtil isNotEmpty span class token punctuation span requ
  • IPV9 : 中国摆脱美国IPV6, 自订互联网标准

    IPV9 中国摆脱美国IPV6 自订互联网标准 根据新华网消息指出 中国于2008 1 23宣布基于十进制技术构建的互联网投入使用 十进制互联网技术形成的IPV9协议 xff0c 是中国在互联网技术上取得的重大自主创新成果 xff0c 为摆
  • K_A18_001 基于STM32等单片机采集MQ2传感参数串口与OLED0.96双显示

    K A18 001 基于STM32等单片机采集MQ2传感参数串口与OLED0 96双显示 一 资源说明二 基本参数参数引脚说明 三 驱动说明IIC地址 采集通道选择 时序对应程序 四 部分代码说明1 接线引脚定义1 1 STC89C52RC
  • Linux命令总结--grep命令

    linux grep命令详解 简介 grep global search regular expression RE and print out the line 全面搜索正则表达式并把行打印出来 是一种强大的文本搜索工具 xff0c 它能
  • OpenStack:01---通过packstack在CentOS7上安装OpenStack(不限版本)

    官方手册步骤太多 xff0c 一着不慎满盘皆输 对于学习体验来说自动化安装的方法较为合适 1 CentOS虚拟机安装 需要注意三点 xff1a 使用mini镜像进行最小化安装配置给够CPU开启虚拟化 下面分别解释 第一条 xff1a cen
  • OpenStack 入门学习之八:OpenStack OVS GRE/VXLAN网络

    文章来自 xff1a http blog sina com cn s blog 9762b74e010135vv html 学习或者使用OpenStack普遍有这样的现象 xff1a 50 的时间花费在了网络部分 xff1b 30 的时间花
  • 面试系列之抽象类和接口的区别

    抽象类 在Java中被abstract关键字修饰的类称为抽象类 xff0c 被abstract关键字修饰的方法称为抽象方法 抽象方法只有方法的声明 xff0c 没有方法体 抽象类无法被实例化 public abstract class Hu
  • 综述:小样本学习中的自监督元素

    来源 xff1a 知乎 嬉嬉皮 侵删 地址 xff1a https zhuanlan zhihu com p 363959407 本文是笔者周末翻论文时做的一点概览性的总结 xff0c 关注一下近年小样本学习中的embedding func
  • 数据库锁机制和CAS概念

    这个作者介绍比较清晰 https www cnblogs com X knight p 10669934 html 64 勋爵
  • SpringBoot整合shiro的一个完整的小案例

    SpringBoot整合配置版的shiro很简单 逻辑清 首先在pom xml的配置如下 shiro使用缓存ehcache span class hljs tag lt span class hljs title dependency sp