Shiro入門視頻課程——筆記(二)
六、加密
1. 編碼/解碼
? Shiro 提供了base64和16進制字符串編碼/解碼的API支持
2. 散列算法
? 散列算法一般用於生成數據的摘要信息,是一種不可逆的算法,一般適合存儲密碼之類的
數據,常見的散列算法如MD5、SHA等
? 一般進行散列加密時都會提供一個salt,加一些幹擾數據,同時可以指定散列次數
3. 加密和驗證服務
3.1 簡介
? Shiro 提供了PasswordService及CredentialsMatcher用於提供加密密碼及驗證密碼服務。
-
PasswordService
用於對明文進行加密,得到密文
實現類:
? DefaultPasswordService
? 自定義密碼服務實現類
-
CredentialsMatcher
密碼匹配器
實現類:
? SimpleCredentialsMatcher 默認的密碼匹配器,直接判斷是否相同
? HashedCredentialsMatcher 散列密碼匹配器,會對用戶輸入的明文密碼先進行加密,然後再與數據源中的密文密碼進行匹配判斷
3.2 加密的JdbcRealm
? 步驟:
-
註冊時將密碼加密後再存儲
-
為JdbcRealm註入一個密碼匹配器
#配置密碼匹配器 credentialsMatcher=org.apache.shiro.authc.credential.HashedCredentialsMatcher credentialsMatcher.hashAlgorithmName=md5 #將密碼匹配器註入到JdbcRealm中 jdbcRealm.credentialsMatcher=$credentialsMatcher
3.3 帶salt加密的JdbcRealm
? 步驟:
-
註冊時將密碼加密(帶salt、散列次數)後再存儲
-
自定義JdbcSaltRealm
由於無法直接通過JdbcRealm註入saltStyle
public class JdbcSaltRealm extends JdbcRealm { //修改saltStyle的值為column public JdbcSaltRealm() { setSaltStyle(SaltStyle.COLUMN); } }
- 配置密碼匹配器
七、授權
1. 簡介
? 授權,也叫訪問控制,控制用戶對資源的訪問
- 權限:增刪改查 CRUD
- 角色:權限的集合,如系統管理員、老師、學生
2. 系統權限表結構
3. 授權流程圖
執行過程,分為四步:
-
Subject
發送請求
-
SecurityManager
接收請求,委托給Authorizer
-
Authorizer
授權器
-
Realm
查詢角色和權限信息
4. 用法
4.1 基本角色的授權
? 在INI配置文件中用戶角色的配置規則:
#用戶名=密碼,角色1,角色2...
[users]
admin=123,manager,teacher
tom=456,student
4.2 基於權限的授權
? 也稱為基於資源的授權
? 在INI配置文件中角色權限的配置規則:角色=權限1,權限2...
? 其中權限的配置規則:資源標識符:操作:實例ID
,表示對哪個資源的哪個實例可以進行什麽操作
user:update:1
product:insert:2
user:view:* 簡寫為 user:view
user:*:* 簡寫為 user 或 user:*(推薦)
*:insert:* 簡寫為 *:insert
user:insert,product:view
#角色=權限1,權限2...(資源:操作:實例ID)
[roles]
manager=manager:*
teacher=teacher:*,student:view
student=student:*
5. 基於JdbcRealm的配置
5.1 表結構
5.2 基於角色的授權
#重寫角色的sql
jdbcRealm.userRolesQuery=select r.role_name from t_user u left join t_user_role ur on u.id=ur.user_id left join t_role r on ur.role_id=r.id where u.login_name=?
5.3 基於權限的授權
? 需要啟用權限查找,設置permissionsLookupEnabled
#啟用權限查找
jdbcRealm.permissionsLookupEnabled=true
#重寫權限的sql
jdbcRealm.permissionsQuery=select p.permission_name from t_role r left join t_role_permission rp on r.id=rp.role_id left join t_permission p on rp.permission_id=p.id where r.role_name=?
八、Spring整合Shiro
1. 搭建環境
- 配置SSM環境
- 實現用戶註冊,明文保存密碼
2. 密文存儲密碼
?
3. 實現用戶登陸(整合Shiro)
? 步驟:
-
添加jar包
<dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-web</artifactId> </dependency> <dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-spring</artifactId> </dependency>
-
配置Shiro過濾器
<!-- 配置Shiro過濾器,用來攔截請求,進行認證和授權 --> <filter> <filter-name>shiroFilter</filter-name> <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class> <!-- 將當前的Filter的生命周期將由web容器管理 --> <init-param> <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>
- 定義一個名為shiroFilter的bean,Shiro攔截請求後會將交由該bean處理
4. 實現登陸驗證(身份認證)
? 應用場景:有些url的訪問需要登陸,未登陸時不允許訪問,此時跳轉到登陸頁面
? 解決:配置url過濾規則
? Shiro提供的默認過濾規則有11個,常用的有4個:
- anon(AnonymousFilter.class) 不需要驗證
- authc(FormAuthenticationFilter.class) 需要登陸驗證
- perms(PermissionsAuthorizationFilter.class) 需要權限驗證
- roles(RolesAuthorizationFilter.class) 需要角色驗證
<bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
<property name="securityManager" ref="securityManager"/>
<!-- url過濾規則 -->
<property name="filterChainDefinitions">
<value>
/showLogin=anon
/showRegist=anon
/user/*=authc
/product/*=authc
</value>
</property>
<!-- 重寫默認的登陸失敗頁面,默認為/login.jsp -->
<property name="loginUrl" value="/showLogin"/>
</bean>
5. 實現角色和權限驗證(授權)
? 一、角色驗證的步驟:
-
添加url過濾規則
/teacher/**=authc,roles[teacher] /student/**=authc,roles[student]
-
重寫角色驗證的sql
<!-- 重寫角色驗證的sql --> <property name="userRolesQuery"> <value> select r.role_name from t_user u left join t_user_role ur on u.id=ur.user_id left join t_role r on ur.role_id=r.id where u.login_name=? </value> </property>
-
重寫角色驗證失敗頁面,默認顯示錯誤碼401
<!-- 重寫角色驗證失敗頁面,默認顯示錯誤碼401 --> <property name="unauthorizedUrl" value="/401.jsp"/>
?二、角色驗證的步驟:
?
九、Shiro標簽庫
? 步驟:
- 導入標簽庫
- 使用標簽
Shiro入門視頻課程——筆記(二)