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

題記:在學習了springboot和thymeleaf以後,想完成一個項目練練手,因而使用springboot+mybatis和thymeleaf完成一個博客系統,在完成的過程當中出現的一些問題,將這些問題記錄下來,做爲本身的學習心得。在這先感謝羣主TyCoding的Tumo項目,雖然本人實在太菜了,好些地方看不懂,但仍是使我受益不淺。web


 

shiro做爲一個小巧靈活的安全框架,在認證和受權方面簡約但又不簡單,十分容易上手使用。下面是整合shiro的具體流程。spring

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

具體流程大同小異。apache

@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

這裏只貼出認證的方法。springboot

    @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加密方式。爲了不麻煩就直接打印加密以後的密碼。mybatis

Md5Hash的參數表明的含義分別是 加密的內容 | 鹽(加密的混淆字符串) | 加密次數
System.out.println(new Md5Hash("123456","zhangbo",3).toString());

能夠看到使用加密過的密碼是能夠登錄成功的,但使用原始密碼是沒法登錄成功的,能夠在具體的業務邏輯層中添加用戶時將密碼進行加密處理。app

相關文章
相關標籤/搜索