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

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


 

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

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中添加一些配置信息。spring

具体流程大同小异。数据库

@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中去获取一些数据,验证用户的认证和受权。apache

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加密方式。为了不麻烦就直接打印加密以后的密码。springboot

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

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

原文出处:https://www.cnblogs.com/Code-Handling/p/12038054.htmlapp

相关文章
相关标签/搜索