這篇文章主要介紹了spring boot整合shiro安全框架過程解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
創(chuàng)新互聯(lián)是專業(yè)的泰寧網(wǎng)站建設(shè)公司,泰寧接單;提供成都網(wǎng)站設(shè)計(jì)、做網(wǎng)站,網(wǎng)頁設(shè)計(jì),網(wǎng)站設(shè)計(jì),建網(wǎng)站,PHP網(wǎng)站建設(shè)等專業(yè)做網(wǎng)站服務(wù);采用PHP框架,可快速的進(jìn)行泰寧網(wǎng)站開發(fā)網(wǎng)頁制作和功能擴(kuò)展;專業(yè)做搜索引擎喜愛的網(wǎng)站,專業(yè)的做網(wǎng)站團(tuán)隊(duì),希望更多企業(yè)前來合作!
題記:在學(xué)習(xí)了springboot和thymeleaf之后,想完成一個(gè)項(xiàng)目練練手,于是使用springboot+mybatis和thymeleaf完成一個(gè)博客系統(tǒng),在完成的過程中出現(xiàn)的一些問題,將這些問題記錄下來,作為自己的學(xué)習(xí)心得。在這先感謝群主TyCoding的Tumo項(xiàng)目,雖然本人實(shí)在太菜了,好些地方看不懂,但還是使我受益匪淺。
shiro作為一個(gè)小巧靈活的安全框架,在認(rèn)證和授權(quán)方面簡(jiǎn)約但又不簡(jiǎn)單,十分容易上手使用。下面是整合shiro的具體流程。
1.添加依賴
org.apache.shiro shiro-spring 1.3.2 org.apache.shiro shiro-core 1.3.2
2.在springboot控制臺(tái)中添加基礎(chǔ)包的掃描和實(shí)體類的掃描注解
由于本人實(shí)在粗心,用try,catch將這個(gè)錯(cuò)誤包起來了,所以找了一個(gè)下午的bug才發(fā)現(xiàn)。如果是用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域
個(gè)人覺得realm就相當(dāng)于一個(gè)數(shù)據(jù)源 ,shiro從realm中去獲取一些數(shù)據(jù),驗(yàn)證用戶的認(rèn)證和授權(quán)。
3.1 usermapper接口
@Mapper public interface UserMapper { /** * 根據(jù)Name查詢用戶數(shù)據(jù) */ SysUser findByName(String username); }
3.2 配置文件usermapper.xml
<?xml version="1.0" encoding="utf-8" ?>
3.3 編寫自定義realm并繼承AuthorizingRealm
這里只貼出認(rèn)證的方法。
@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.根據(jù)用戶名查詢數(shù)據(jù)庫 SysUser user = userMapper.findByName(username); //3.判斷用戶是否存在或者密碼是否一致 if(user != null && user.getPassword().equals(password)) { //4.如果一致返回安全數(shù)據(jù) //構(gòu)造方法:安全數(shù)據(jù),密碼,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) { //使用默認(rèn)的安全管理器 DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager(realm); //將自定義的realm交給安全管理器統(tǒng)一調(diào)度管理 securityManager.setRealm(realm); return securityManager; }
4.2 配置過濾器工廠
@Bean public ShiroFilterFactoryBean shiroFilter(SecurityManager securityManager) { //1.創(chuàng)建過濾器工廠 ShiroFilterFactoryBean filterFactory = new ShiroFilterFactoryBean(); //2.設(shè)置安全管理器 filterFactory.setSecurityManager(securityManager); //3.通用配置(跳轉(zhuǎn)登錄頁面,為授權(quán)跳轉(zhuǎn)的頁面) filterFactory.setLoginUrl("#");//跳轉(zhuǎn)url地址 filterFactory.setUnauthorizedUrl("#");//未授權(quán)的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 "用戶名或密碼錯(cuò)誤"; } }
6.登陸
6.1 獲取md5加密的密碼
由于密碼是使用shiro提供的Md5加密方式。為了避免麻煩就直接打印加密之后的密碼。
Md5Hash的參數(shù)代表的含義分別是 加密的內(nèi)容 | 鹽(加密的混淆字符串) | 加密次數(shù) System.out.println(new Md5Hash("123456","zhangbo",3).toString());
可以看到使用加密過的密碼是可以登陸成功的,但使用原始密碼是無法登陸成功的,可以在具體的業(yè)務(wù)邏輯層中添加用戶時(shí)將密碼進(jìn)行加密處理。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持創(chuàng)新互聯(lián)。