题记:在学习了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中添加一些配置信息。

具体流程大同小异。

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

3.自定义realm域

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

3.1 usermapper接口

  1. @Mapper
  2. public interface UserMapper {
  3.  
  4. /**
  5. * 根据Name查询用户数据
  6. */
  7. SysUser findByName(String username);
  8. }

3.2 配置文件usermapper.xml

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

3.3 编写自定义realm并继承AuthorizingRealm

这里只贴出认证的方法。

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

4.编写shiro配置类

4.1 安全管理器

  1. //配置自定义的Realm
  2. @Bean
  3. public AuthRealm getRealm() {
  4. return new AuthRealm();
  5. }
  6.  
  7. //配置安全管理器
  8. @Bean
  9. public SecurityManager securityManager(AuthRealm realm) {
  10. //使用默认的安全管理器
  11. DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager(realm);
  12. //将自定义的realm交给安全管理器统一调度管理
  13. securityManager.setRealm(realm);
  14. return securityManager;
  15. }

4.2 配置过滤器工厂

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

5. 编写controller方法

  1. @RequestMapping(value="/login")
  2. @ResponseBody
  3. public String login(String username,String password) {
  4. try{
  5. Subject subject = SecurityUtils.getSubject();
  6. UsernamePasswordToken uptoken = new UsernamePasswordToken(username,password);
  7. subject.login(uptoken);
  8. return "登录成功";
  9. }catch (Exception e) {
  10. return "用户名或密码错误";
  11. }
  12. }

6.登陆

6.1 获取md5加密的密码

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

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

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

上手spring boot项目(二)之spring boot整合shiro安全框架的更多相关文章

  1. Spring Boot 2 (二):Spring Boot 2 动态 Banner

    Spring Boot 2 (二):Spring Boot 2 动态 Banner Spring Boot 2.0 提供了很多新特性,其中就有一个小彩蛋:动态 Banner. 一.配置依赖 使用 Sp ...

  2. Spring Boot(十二):spring boot如何测试打包部署

    Spring Boot(十二):spring boot如何测试打包部署 一.开发阶段 1,单元测试 在开发阶段的时候最重要的是单元测试了,springboot对单元测试的支持已经很完善了. (1)在p ...

  3. Spring Boot 项目学习 (四) Spring Boot整合Swagger2自动生成API文档

    0 引言 在做服务端开发的时候,难免会涉及到API 接口文档的编写,可以经历过手写API 文档的过程,就会发现,一个自动生成API文档可以提高多少的效率. 以下列举几个手写API 文档的痛点: 文档需 ...

  4. Spring Boot 项目学习 (三) Spring Boot + Redis 搭建

    0 引言 本文主要介绍 Spring Boot 中 Redis 的配置和基本使用. 1 配置 Redis 1. 修改pom.xml,添加Redis依赖 <!-- Spring Boot Redi ...

  5. (转)Spring Boot 2 (二):Spring Boot 2 尝鲜-动态 Banner

    http://www.ityouknow.com/springboot/2018/03/03/spring-boot-banner.html Spring Boot 2.0 提供了很多新特性,其中就有 ...

  6. (转)Spring Boot(十二):Spring Boot 如何测试打包部署

    http://www.ityouknow.com/springboot/2017/05/09/spring-boot-deploy.html 有很多网友会时不时的问我, Spring Boot 项目如 ...

  7. Spring Boot(十二):Spring Boot 如何测试打包部署

    有很多网友会时不时的问我, Spring Boot 项目如何测试,如何部署,在生产中有什么好的部署方案吗?这篇文章就来介绍一下 Spring Boot 如何开发.调试.打包到最后的投产上线. 开发阶段 ...

  8. Spring Boot 2 (二):Spring Boot 2 尝鲜-动态 Banner

    Spring Boot 2.0 提供了很多新特性,其中就有一个小彩蛋:动态 Banner,今天我们就先拿这个来尝尝鲜. 配置依赖 使用 Spring Boot 2.0 首先需要将项目依赖包替换为刚刚发 ...

  9. 【spring】【spring mvc】【spring boot】获取spring cloud项目中所有spring mvc的请求资源

    实现的方法: 1.在父级项目中 或者 每个微服务都引用的项目中添加实体类Resource 2.在父级项目中 或者 每个为服务都引用的项目中写一个工具类,作用是用来获取请求资源 3.在每一个微服务的启动 ...

随机推荐

  1. p1594(巨坑题!!!)

    护卫车队在一条单行的街道前排成一队,前面河上是一座单行的桥.因为街道是一条单行道,所以任何车辆都不能超车.桥能承受一个给定的最大承载量.为了控制桥上的交通,桥两边各站一个指挥员.护卫车队被分成几个组, ...

  2. markdown 编辑器概述

    markdown 编辑器概述     编辑器其实很多很多,主要分为    网页编辑和软件编辑 (效果其实感觉效果差不多,看个人喜好,笔者个人还是喜欢本地,感觉方便挺多的) ## 网页编辑器 主要有 C ...

  3. php 环境require(): open_basedir restriction in effect 错误

    php 环境require(): open_basedir restriction in effect 错误 错误日志显示,访问脚本不在 open_basedir的限定目录里面 解决方法打开fastc ...

  4. C++图像加Lidar点云转写rosbag

    近期需要处理一批Lidar+image的数据,拿到的是其他格式,但要转存成rosbag使用,参考部分网上做法,完成并记录. 1.Lidar处理 主要是将Lidar点云信息按点转为pcl::PointX ...

  5. tp5验证码的使用

    <div><img id="verify_img" src="{:captcha_src()}" alt="验证码" on ...

  6. vue项目iframe的传值问题

    前言 项目需要,我需要引入一个已经封装好的浏览器插件.插件只能以html的方式调用, 所以.我把插件的使用封装了一个html页面.vue项目则利用iframe的方式引入. 到这里我就遇到了一个问题,那 ...

  7. Spring Boot2 系列教程(二十四)Spring Boot 整合 Jpa

    Spring Boot 中的数据持久化方案前面给大伙介绍了两种了,一个是 JdbcTemplate,还有一个 MyBatis,JdbcTemplate 配置简单,使用也简单,但是功能也非常有限,MyB ...

  8. 通过ESP8266调节继电器时间

    通过ESP8266调节继电器时间 1.继电器选择(可调节时间的继电器) 2.继电器与esp8266的接线[set --- D6,UP --- D5,DOWN --- D1] 3.Arduino 程序 ...

  9. opencv 3 core组件进阶(1 访问图像中的像素)

    访问图像像素的三类方法 ·方法一 指针访问:C操作符[ ]; ·方法二 迭代器iterator; ·方法三 动态地址计算. #include <opencv2/core/core.hpp> ...

  10. Python文件和数据格式化(教程)

    文件是一个存储在副主存储器的数据序列,可包含任何数据内容. 概念上,文件是数据的集合和抽象,类似的,函数是程序的集合和抽象. 用文件形式组织和表达数据更有效也更加灵活. 文件包括两种形式,文本文件和二 ...