1. 程式人生 > >Shiro入門視頻課程——筆記(二)

Shiro入門視頻課程——筆記(二)

過程 需要 身份認證 perm () 表示 bcs 搭建環境 添加jar包

視頻課程鏈接:http://edu.51cto.com/course/14122.html

六、加密

1. 編碼/解碼

? Shiro 提供了base64和16進制字符串編碼/解碼的API支持

2. 散列算法

? 散列算法一般用於生成數據的摘要信息,是一種不可逆的算法,一般適合存儲密碼之類的
數據,常見的散列算法如MD5、SHA等

? 一般進行散列加密時都會提供一個salt,加一些幹擾數據,同時可以指定散列次數

3. 加密和驗證服務

3.1 簡介

? Shiro 提供了PasswordService及CredentialsMatcher用於提供加密密碼及驗證密碼服務。

  • PasswordService

    用於對明文進行加密,得到密文

    實現類:

    ? DefaultPasswordService

    ? 自定義密碼服務實現類

  • CredentialsMatcher

    密碼匹配器

    實現類:

    ? SimpleCredentialsMatcher 默認的密碼匹配器,直接判斷是否相同

    ? HashedCredentialsMatcher 散列密碼匹配器,會對用戶輸入的明文密碼先進行加密,然後再與數據源中的密文密碼進行匹配判斷

3.2 加密的JdbcRealm

? 步驟:

  1. 註冊時將密碼加密後再存儲

  2. 為JdbcRealm註入一個密碼匹配器

    #配置密碼匹配器
    credentialsMatcher=org.apache.shiro.authc.credential.HashedCredentialsMatcher
    credentialsMatcher.hashAlgorithmName=md5
    #將密碼匹配器註入到JdbcRealm中
    jdbcRealm.credentialsMatcher=$credentialsMatcher

3.3 帶salt加密的JdbcRealm

? 步驟:

  1. 註冊時將密碼加密(帶salt、散列次數)後再存儲

  2. 自定義JdbcSaltRealm

    由於無法直接通過JdbcRealm註入saltStyle

    public class JdbcSaltRealm extends JdbcRealm {
    
       //修改saltStyle的值為column
       public JdbcSaltRealm() {
           setSaltStyle(SaltStyle.COLUMN);
       }
    }
  3. 配置密碼匹配器

七、授權

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. 搭建環境

  1. 配置SSM環境
  2. 實現用戶註冊,明文保存密碼

2. 密文存儲密碼

?

3. 實現用戶登陸(整合Shiro)

? 步驟:

  1. 添加jar包

    <dependency>
     <groupId>org.apache.shiro</groupId>
     <artifactId>shiro-web</artifactId>
    </dependency>
    <dependency>
     <groupId>org.apache.shiro</groupId>
     <artifactId>shiro-spring</artifactId>
    </dependency>
  2. 配置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>
  3. 定義一個名為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. 實現角色和權限驗證(授權)

? 一、角色驗證的步驟:

  1. 添加url過濾規則

    /teacher/**=authc,roles[teacher]
    /student/**=authc,roles[student]
  2. 重寫角色驗證的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>
  3. 重寫角色驗證失敗頁面,默認顯示錯誤碼401

    <!-- 重寫角色驗證失敗頁面,默認顯示錯誤碼401 -->
    <property name="unauthorizedUrl" value="/401.jsp"/>

    ?二、角色驗證的步驟:

    ?

九、Shiro標簽庫

? 步驟:

  1. 導入標簽庫
  2. 使用標簽

Shiro入門視頻課程——筆記(二)