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

 更新时间:2019年11月28日 15:03:19   作者:程序猿修炼之道  
这篇文章主要介绍了spring boot整合shiro安全框架过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

这篇文章主要介绍了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 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());

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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • JAVA线程同步实例教程

    JAVA线程同步实例教程

    这篇文章主要介绍了JAVA线程同步实例教程,在Java程序设计中有着非常广泛的应用,需要的朋友可以参考下
    2014-08-08
  • Springboot中登录后关于cookie和session拦截问题的案例分析

    Springboot中登录后关于cookie和session拦截问题的案例分析

    这篇文章主要介绍了Springboot中登录后关于cookie和session拦截案例,本文通过实例图文相结合给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-08-08
  • java 输出九九乘法表口诀的代码

    java 输出九九乘法表口诀的代码

    这篇文章主要介绍了java 输出9*9口诀的代码,需要的朋友可以参考下
    2017-02-02
  • 一口气说出Java 6种延时队列的实现方法(面试官也得服)

    一口气说出Java 6种延时队列的实现方法(面试官也得服)

    这篇文章主要介绍了一口气说出Java 6种延时队列的实现方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-05-05
  • 解决IDEA的maven项目中没有新建Servlet文件的选项问题

    解决IDEA的maven项目中没有新建Servlet文件的选项问题

    这篇文章主要介绍了IDEA的maven项目中没有新建Servlet文件的选项问题及解决方法,本文给大家分享问题原因就解决方法,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-09-09
  • JAVA基础之控制台输入输出的实例代码

    JAVA基础之控制台输入输出的实例代码

    下面小编就为大家带来一篇JAVA基础之控制台输入输出的实例代码。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-07-07
  • Spring MVC实现文件上传和下载

    Spring MVC实现文件上传和下载

    这篇文章主要为大家详细介绍了Spring MVC实现文件上传和下载,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-04-04
  • SpringBoot日程管理Quartz与定时任务Task实现详解

    SpringBoot日程管理Quartz与定时任务Task实现详解

    定时任务是企业级开发中必不可少的组成部分,诸如长周期业务数据的计算,例如年度报表,诸如系统脏数据的处理,再比如系统性能监控报告,还有抢购类活动的商品上架,这些都离不开定时任务。本节将介绍两种不同的定时任务技术
    2022-09-09
  • iReport使用指南及常见功能示例详解

    iReport使用指南及常见功能示例详解

    这篇文章主要介绍了iReport使用指南及常见功能,本文以iReport 3.5.1为例,通过示例演示给大家介绍的非常详细,需要的朋友可以参考下
    2021-10-10
  • Spring中的BeanFactory工厂详细解析

    Spring中的BeanFactory工厂详细解析

    这篇文章主要介绍了Spring中的BeanFactory工厂详细解析,Spring的本质是一个bean工厂(beanFactory)或者说bean容器,它按照我们的要求,生产我们需要的各种各样的bean,提供给我们使用,需要的朋友可以参考下
    2023-12-12

最新评论