当前位置 主页 > 网站技术 > 代码类 >

    spring boot整合shiro安全框架过程解析

    栏目:代码类 时间:2019-11-28 18:05

    这篇文章主要介绍了spring boot整合shiro安全框架过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

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

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

    1.添加依赖

    <!--shiro和spring整合-->
    <dependency>
       <groupId>org.apache.shiro</groupId>
       <artifactId>shiro-spring</artifactId>
       <version>1.3.2</version>
    </dependency>
    <!--shiro核心包-->
    <dependency>
       <groupId>org.apache.shiro</groupId>
        <artifactId>shiro-core</artifactId>
        <version>1.3.2</version>
    </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  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;
      }