日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

大数据WEB阶段 shiro安全控制框架

發(fā)布時(shí)間:2024/4/30 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 大数据WEB阶段 shiro安全控制框架 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

shiro安全框架

零、目錄

  • 問題引申
  • shiro介紹
  • shiro工作流程
  • 使用shiro 進(jìn)行登錄操作
  • 使用shiro進(jìn)行權(quán)限管理

一、 問題引申

  • 需要實(shí)現(xiàn)的功能: 用戶沒有登錄的情況下 , 處理登錄界面其他頁面都不能訪問
  • 權(quán)限控制: 根據(jù)用戶的權(quán)限列表內(nèi)的權(quán)限 , 控制頁面中各項(xiàng)功能的顯示
  • 解決方案: shiro安全框架
  • 二、 shiro安全框架介紹

  • Authentication:登錄證明 , 當(dāng)用戶登錄系統(tǒng)時(shí)需要使用這個(gè)模塊 , 此時(shí)shiro框架內(nèi)部會(huì)自己做登錄校驗(yàn) , 如果登錄通過則證明用戶名密碼正確
  • Authorization: 權(quán)限認(rèn)證: 當(dāng)用戶沒有登錄時(shí) , 不能隨意發(fā)出請(qǐng)求 , 當(dāng)不同的用戶登錄時(shí)會(huì)通過用戶的權(quán)限列表控制頁面功能的顯示或隱藏。
  • SessionManagement: session管理器 , 處理session問題
  • Cryptography: 加密模塊 , 包含了加密算法和加密工具類MD5Hash
  • 類似產(chǎn)品: Spring Security 是Spring的子產(chǎn)品 , 但是由于配置過于繁瑣所以不被廣泛使用
  • 三、工作流程

  • Application: 應(yīng)用程序代碼
  • Subject: Subject是shiro框架對(duì)外暴露的唯一接口 , 如果用戶需要登錄驗(yàn)證 , 需要?jiǎng)?chuàng)建Subject對(duì)象才能通過shiro安全中心進(jìn)行各種操作 ,
  • shiro SecurityManager: shiro安全管理器 , 處理登錄或權(quán)限控制等問題等內(nèi)部邏輯
  • Realm: 代表進(jìn)行登錄或權(quán)限控制的原材料 , 登錄時(shí)需要給shiro提供正確的用戶信息和登錄的用戶名和密碼 。
  • 執(zhí)行流程:
  • 程序員創(chuàng)建subject , 提交登錄的請(qǐng)求發(fā)送到shiro安全管理器
  • 此時(shí)shiro安全管理器并不知道正確的信息是什么 , 需要通過realm得到正確的登錄信息
  • 四、使用shiro進(jìn)行登錄操作

  • 導(dǎo)入需要依賴的jar包

    <!-- Apache Shiro 權(quán)限架構(gòu) --> <dependency><groupId>org.apache.shiro</groupId><artifactId>shiro-all</artifactId><version>1.2.3</version> </dependency>
  • 創(chuàng)建shiro的配置文件 一共5個(gè)bean

    <?xml version="1.0" encoding="UTF-8"?><beansxmlns="http://www.springframework.org/schema/beans"xmlns:tx="http://www.springframework.org/schema/tx"xmlns:aop="http://www.springframework.org/schema/aop"xmlns:context="http://www.springframework.org/schema/context"xmlns:util="http://www.springframework.org/schema/util"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:p="http://www.springframework.org/schema/p"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsdhttp://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.2.xsdhttp://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.2.xsdhttp://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.2.xsd"><!--1. 安全管理器 --><bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager"><!-- 注入原材料 --><property name="realm" ref="authRealm"></property></bean><!-- 2. 創(chuàng)建原材料 com.tj.ht.shiro.AuthRleam類--><!-- 3. 引入原材料 --><bean id="authRealm" class="com.tj.ht.shiro.AuthRealm"><!-- 注入加密匹配器 --><property name="credentialsMatcher" ref="authMatcher"></property></bean> <!-- 4. 創(chuàng)建加密匹配器 com.tj.ht.shiro.AuthMatcher類--><!-- 5. 引入加密匹配器 --><bean id="authMatcher" class="com.tj.ht.shiro.AuthMatcher"></bean><!-- 6. 權(quán)限認(rèn)證 的觀察器 --><bean id="advisor" class="org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor"><!-- 注入安全管理器 --><property name="securityManager" ref="securityManager"></property></bean><!-- 7. shiro過濾工廠 --><bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean" ><!-- 輸入安全管理器 --><property name="securityManager" ref="securityManager"></property><!-- 配置登陸地址 如果沒有登陸則跳轉(zhuǎn)發(fā)出登陸請(qǐng)求 , 跳轉(zhuǎn)到登陸界面 默認(rèn)是放行的--><property name="loginUrl" value="/tologin.action"></property><!-- 配置攔截 和 放行地址 --><property name="filterChainDefinitions"><value><!-- anon 放行 --><!-- authc 攔截 -->/login.action=anon <!-- 對(duì)登陸放行 --><!-- /* 代表 所有請(qǐng)求 --><!-- /**代表所有請(qǐng)求及靜態(tài)資源文件 -->/staticfile/**=anon <!-- 對(duì)靜態(tài)資源放行 -->/sysadmin/user/tocreate=anon<!-- 對(duì)添加用戶放行 測(cè)試用 -->/sysadmin/user/save=anon<!-- 對(duì)添加用戶放行 測(cè)試用-->/**=authc<!-- 除了上面放行的資源 , 其余全部攔截 --></value></property></bean></beans>
  • 在web.xml文件中配置過濾器

    <!-- 配置安全框架過濾器 --><filter><filter-name>shiroFilter</filter-name><filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class><init-param><!-- 吧過濾器的生命周期交給web容器進(jìn)行管理 --><param-name>targetFilterLifecycle</param-name><param-value>true</param-value></init-param></filter><filter-mapping><filter-name>shiroFilter</filter-name><url-pattern>/*</url-pattern></filter-mapping>
  • 執(zhí)行流程

  • 在loginController中攔截login請(qǐng)求 , 并創(chuàng)建subject
  • 調(diào)用subject的login方法 , 讓安全管理器進(jìn)行登錄校驗(yàn)
  • 安全管理器回去找AuthRealm獲取登錄的原材料信息 , 在AuthRealm類中通過用戶名獲取正確的用戶信息和密碼交由安全管理器進(jìn)行校驗(yàn)
  • 安全管理器進(jìn)行登錄檢驗(yàn)時(shí)需要先把用戶輸入的明文密碼加密后再與數(shù)據(jù)庫中加密后的面比對(duì) ,這是會(huì)去找自定義的AuthCredentialMatcher

    1. 攔截登錄請(qǐng)求 @RequestMapping("login.action") public String login(Model model , String username , String password ) {//獲取subject對(duì)象Subject subject = SecurityUtils.getSubject();//創(chuàng)建用戶名密碼令牌UsernamePasswordToken token = new UsernamePasswordToken(username , password);try{//安全框架進(jìn)行登陸subject.login(token);//得到登錄成功的信息User u = (User) subject.getPrincipal();model.addAttribute("_CURRENT_USER", u);//把用戶信息存進(jìn)session中}catch(AuthenticationException e) {e.printStackTrace();//登錄失敗model.addAttribute("errorInfo", "用戶名或密碼錯(cuò)誤!");return "sysadmin/login/login";}//登錄成功return "redirect:/home"; } 2. AuthRealm類 public class AuthRealm extends SimpleAccountRealm{@Autowiredprivate UserService userService;//登錄證明@Overrideprotected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {//需要給安全中i性能提供的登陸校驗(yàn)的信息 1. 用戶正確信息 2. 提交的信息//得到正確信息//用戶輸入的信息UsernamePasswordToken myToken = (UsernamePasswordToken) token;//通過提交的用戶名查詢用戶正確信息User user = userService.findOneByUsername(myToken.getUsername());//創(chuàng)建用于登陸的原材料信息//參數(shù) 1. 正確信息 2. 需要驗(yàn)證的正確信息 3. 原材料的類的名稱AuthenticationInfo info = new SimpleAuthenticationInfo(user, user.getPassword(), this.getName());return info;}//權(quán)限認(rèn)證@Overrideprotected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {// TODO Auto-generated method stubreturn super.doGetAuthorizationInfo(principals);}} 3. AuthMatcher類 public class AuthMatcher extends SimpleCredentialsMatcher{//需要在此位置對(duì)原材料中的密碼進(jìn)行加密操作@Overridepublic boolean doCredentialsMatch(AuthenticationToken token, AuthenticationInfo info) {//得到明文密碼 加密后設(shè)置回去UsernamePasswordToken myToken = (UsernamePasswordToken) token;Md5Hash md5Hash = new Md5Hash(String.valueOf(myToken.getPassword()) , myToken.getUsername(), 3);//設(shè)置回去myToken.setPassword(md5Hash.toString().toCharArray());return super.doCredentialsMatch(myToken, info);}} 4. 登出操作 @RequestMapping("logout") public String logout(Model model,HttpSession session) {session.removeAttribute("_CURRENT_USER");//通知shiro框架 退出登錄Subject subject = SecurityUtils.getSubject();//判斷是否是登錄狀態(tài) , 如果是則退出if(subject.isAuthenticated()) {subject.logout();}return "sysadmin/login/login"; }
  • 五、通過shiro實(shí)現(xiàn)權(quán)限管理

  • 在原材料中提供當(dāng)前用戶所擁有的權(quán)限列表
  • 頁面顯示的時(shí)候通過shiro標(biāo)簽進(jìn)行權(quán)限判斷 , 如果有權(quán)限才允許在頁面中顯示相應(yīng)的功能
  • 代碼

    1. 正原材料類中添加權(quán)限認(rèn)證代碼 public class AuthRealm extends SimpleAccountRealm{@Autowiredprivate UserService userService;//登錄證明@Overrideprotected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {//需要給安全中i性能提供的登陸校驗(yàn)的信息 1. 用戶正確信息 2. 提交的信息//得到正確信息//用戶輸入的信息UsernamePasswordToken myToken = (UsernamePasswordToken) token;//通過提交的用戶名查詢用戶正確信息User user = userService.findOneByUsername(myToken.getUsername());//創(chuàng)建用于登陸的原材料信息//參數(shù) 1. 正確信息 2. 需要驗(yàn)證的正確信息 3. 原材料的類的名稱AuthenticationInfo info = new SimpleAuthenticationInfo(user, user.getPassword(), this.getName());return info;}//權(quán)限認(rèn)證@Overrideprotected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {User user = (User) principals.getPrimaryPrincipal();List<String> ps = userService.findAllModulesByUserId(user.getUserId());SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();info.addRoles(ps);return info;}} 2. 在頁面中引入標(biāo)簽 <%@ taglib uri="http://shiro.apache.org/tags" prefix="shiro" %> 3. 對(duì)頁面中的模塊請(qǐng)求進(jìn)行控制 <shiro:hasPermission name="貨運(yùn)管理"> //name要與原材料中l(wèi)ist中的權(quán)限一致<span id="topmenu" onclick="toModule('cargo');">貨運(yùn)管理</span><span id="tm_separator"></span> </shiro:hasPermission> <shiro:hasPermission name="基礎(chǔ)信息"> <span id="topmenu" onclick="toModule('baseinfo');">基礎(chǔ)信息</span><span id="tm_separator"></span></shiro:hasPermission><shiro:hasPermission name="系統(tǒng)管理"> <span id="topmenu" onclick="toModule('sysadmin');">系統(tǒng)管理</span></shiro:hasPermission>
  • 與50位技術(shù)專家面對(duì)面20年技術(shù)見證,附贈(zèng)技術(shù)全景圖

    總結(jié)

    以上是生活随笔為你收集整理的大数据WEB阶段 shiro安全控制框架的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。