• 上手spring boot项目(二)之spring boot整合shiro安全框架


    题记:在学习了springboot和thymeleaf之后,想完成一个项目练练手,于是使用springboot+mybatis和thymeleaf完成一个博客系统,在完成的过程中出现的一些问题,将这些问题记录下来,作为自己的学习心得。在这先感谢群主TyCoding的Tumo项目,虽然本人实在太菜了,好些地方看不懂,但还是使我受益匪浅。


    shiro作为一个小巧灵活的安全框架,在认证和授权方面简约但又不简单,十分容易上手使用。下面是整合shiro的具体流程。

    1.添加依赖

     1 <!--shiro和spring整合-->
     2 <dependency>
     3       <groupId>org.apache.shiro</groupId>
     4       <artifactId>shiro-spring</artifactId>
     5       <version>1.3.2</version>
     6 </dependency>
     7 <!--shiro核心包-->
     8 <dependency>
     9       <groupId>org.apache.shiro</groupId>
    10        <artifactId>shiro-core</artifactId>
    11        <version>1.3.2</version>
    12 </dependency>

    2.在springboot控制台中添加基础包的扫描和实体类的扫描注解

    由于本人实在粗心,用try,catch将这个错误包起来了,所以找了一个下午的bug才发现。如果是用ssm整合shiro也大致一样,只不过需要在web.xml中添加一些配置信息。

    具体流程大同小异。

    @SpringBootApplication(scanBasePackages = "cn.zhq")
    @EntityScan("cn.zhq.system.entity")
    public class MyBlogApplication {
        public static void main(String[] args) {
            SpringApplication.run(MyBlogApplication.class);
        }
    }

    3.自定义realm域

    个人觉得realm就相当于一个数据源 ,shiro从realm中去获取一些数据,验证用户的认证和授权。

    3.1 usermapper接口

    @Mapper
    public interface UserMapper {
    
        /**
         * 根据Name查询用户数据
         */
        SysUser findByName(String username);
    }

    3.2 配置文件usermapper.xml

    <?xml version="1.0" encoding="utf-8" ?>
    <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
            "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
    <mapper namespace="cn.zhq.system.mapper.UserMapper">
        <select id="findByName" resultType="sysuser" parameterType="String">
          select * from tb_user where username = #{username}
        </select>
    </mapper>

    3.3 编写自定义realm并继承AuthorizingRealm

    这里只贴出认证的方法。

        @Autowired
        private UserMapper userMapper;
    
        @Override
        protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {
            //1.获取登录的用户名密码(token)
            UsernamePasswordToken upToken = (UsernamePasswordToken) authenticationToken;
            String username = upToken.getUsername();
            String password = new String( upToken.getPassword());
            //2.根据用户名查询数据库
            SysUser user = userMapper.findByName(username);
            //3.判断用户是否存在或者密码是否一致
            if(user != null && user.getPassword().equals(password)) {
                //4.如果一致返回安全数据
                //构造方法:安全数据,密码,realm域名
                SimpleAuthenticationInfo info = new SimpleAuthenticationInfo(user,user.getPassword(),this.getName());
                return info;
            }
            //5.不一致,返回null(抛出异常)
            return null;
        }    

    4.编写shiro配置类

    4.1 安全管理器

        //配置自定义的Realm
        @Bean
        public AuthRealm getRealm() {
            return new AuthRealm();
        }
    
        //配置安全管理器
        @Bean
        public SecurityManager securityManager(AuthRealm realm) {
            //使用默认的安全管理器
            DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager(realm);
            //将自定义的realm交给安全管理器统一调度管理
            securityManager.setRealm(realm);
            return securityManager;
        }

    4.2 配置过滤器工厂

    @Bean
        public ShiroFilterFactoryBean shiroFilter(SecurityManager securityManager) {
            //1.创建过滤器工厂
            ShiroFilterFactoryBean filterFactory = new ShiroFilterFactoryBean();
            //2.设置安全管理器
            filterFactory.setSecurityManager(securityManager);
            //3.通用配置(跳转登录页面,为授权跳转的页面)
            filterFactory.setLoginUrl("#");//跳转url地址
            filterFactory.setUnauthorizedUrl("#");//未授权的url
            return filterFactory;
        }

    5. 编写controller方法

        @RequestMapping(value="/login")
        @ResponseBody
        public String login(String username,String password) {
            try{
                Subject subject = SecurityUtils.getSubject();
                UsernamePasswordToken uptoken = new UsernamePasswordToken(username,password);
                subject.login(uptoken);
                return "登录成功";
            }catch (Exception e) {
                return "用户名或密码错误";
            }
        }

    6.登陆

    6.1 获取md5加密的密码

    由于密码是使用shiro提供的Md5加密方式。为了避免麻烦就直接打印加密之后的密码。

    Md5Hash的参数代表的含义分别是 加密的内容 | 盐(加密的混淆字符串) | 加密次数
    System.out.println(new Md5Hash("123456","zhangbo",3).toString());

    可以看到使用加密过的密码是可以登陆成功的,但使用原始密码是无法登陆成功的,可以在具体的业务逻辑层中添加用户时将密码进行加密处理。

  • 相关阅读:
    【收集】各种hack
    CSS测试实录一:display的块状元素和行内元素的试验
    【转载加工】:after伪类+content内容生成经典应用举例
    CSS测试实录二:float和标准流
    onreadyStateChange&nbsp;&nbsp;DOMContentLoaded
    Extensions
    Accessing of Rows in Silverlight DataGrid
    Linux应用程序的装载和执行
    top状态细分,进程状态
    定时器的使用和原理浅析,alarm/sleep函数
  • 原文地址:https://www.cnblogs.com/Code-Handling/p/12038054.html
Copyright © 2020-2023  润新知