shiro教程5(整合SSM項目-認證)

搭建好SSM項目

這個之前已經講過,參考之前案例整合教程

項目中引入相關依賴


<dependency>
\t<groupid>org.apache.shiro/<groupid>
\t<artifactid>shiro-spring/<artifactid>
\t<version>1.2.3/<version>
/<dependency>
<dependency>
\t<groupid>org.apache.shiro/<groupid>
\t<artifactid>shiro-ehcache/<artifactid>
\t<version>1.2.3/<version>
/<dependency>

web.xml文件中註冊shiro過濾器


<web-app>\txmlns="http://java.sun.com/xml/ns/javaee"
\txsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
\tid="WebApp_ID" version="3.0">
\t<display-name>test/<display-name>
\t
\t<context-param>
\t\t<param-name>contextConfigLocation/<param-name>
\t\t<param-value>classpath:applicationContext-*.xml/<param-value>
\t/<context-param>
\t<listener>
\t\t<listener-class>org.springframework.web.context.ContextLoaderListener/<listener-class>
\t/<listener>
\t<servlet>
\t\t<servlet-name>springmvc/<servlet-name>
\t\t<servlet-class>org.springframework.web.servlet.DispatcherServlet/<servlet-class>
\t\t<init-param>
\t\t\t<param-name>contextConfigLocation/<param-name>
\t\t\t<param-value>classpath:spring-mvc.xml/<param-value>
\t\t/<init-param>
\t/<servlet>
\t<servlet-mapping>
\t\t<servlet-name>springmvc/<servlet-name>

\t\t<url-pattern>//<url-pattern>
\t/<servlet-mapping>
\t<filter>
\t\t<filter-name>encoding/<filter-name>
\t\t<filter-class>org.springframework.web.filter.CharacterEncodingFilter/<filter-class>
\t\t<init-param>
\t\t\t<param-name>encoding/<param-name>
\t\t\t<param-value>UTF-8/<param-value>
\t\t/<init-param>
\t\t<init-param>
\t\t\t<param-name>forceRequestEncoding/<param-name>
\t\t\t<param-value>true/<param-value>
\t\t/<init-param>
\t\t<init-param>
\t\t\t<param-name>forceResponseEncoding/<param-name>
\t\t\t<param-value>true/<param-value>
\t\t/<init-param>
\t/<filter>
\t<filter-mapping>
\t\t<filter-name>encoding/<filter-name>
\t\t<url-pattern>/*/<url-pattern>
\t/<filter-mapping>

\t
\t<filter>
\t\t<filter-name>shiroFilter/<filter-name>
\t\t<filter-class>org.springframework.web.filter.DelegatingFilterProxy/<filter-class>
\t\t
\t\t<init-param>
\t\t\t<param-name>targetFilterLifecycle/<param-name>
\t\t\t<param-value>true/<param-value>
\t\t/<init-param>
\t\t
\t\t<init-param>
\t\t\t<param-name>targetBeanName/<param-name>
\t\t\t<param-value>shiro/<param-value>
\t\t/<init-param>
\t/<filter>
\t<filter-mapping>
\t\t<filter-name>shiroFilter/<filter-name>
\t\t<url-pattern>/*/<url-pattern>
\t/<filter-mapping>
\t

\t<servlet-mapping>
\t\t<servlet-name>default/<servlet-name>
\t\t<url-pattern>*.jpg/<url-pattern>
\t/<servlet-mapping>
\t<servlet-mapping>
\t\t<servlet-name>default/<servlet-name>
\t\t<url-pattern>*.js/<url-pattern>
\t/<servlet-mapping>
\t<servlet-mapping>
\t\t<servlet-name>default/<servlet-name>
\t\t<url-pattern>*.css/<url-pattern>
\t/<servlet-mapping>
/<web-app>

添加shiro的配置文件

注意shiro的配置可以添加在spring的配置文件中。但是為了便於管理我們再單獨創建一個shiro的配置文件,裡面的Schema還是spring的。

shiro教程5(整合SSM項目-認證)

同時web.xml文件中加載spring的位置也需要調整

shiro教程5(整合SSM項目-認證)

applicationContext-shiro.xml中的內容:


<beans>\txmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
\txmlns:context="http://www.springframework.org/schema/context"
\txmlns:aop="http://www.springframework.org/schema/aop"
\txsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
\t\thttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd
\t\thttp://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.3.xsd">

\t
\t<bean>
\t\t
\t\t<property>
\t\t
\t\t<property>
\t/<bean>
\t
\t
\t<bean>
\t\t
\t\t<property>
\t/<bean>
\t
\t
\t<bean>
\t\t
\t\t<property>
\t/<bean>
\t
\t
\t<bean>
\t\t

\t\t<property>
\t\t
\t\t<property>
\t\t
\t\t<property>
\t\t
\t\t<property>
\t\t
\t\t<property>
\t\t\t<value>
\t\t\t\t
\t\t\t\t/login.do=authc
\t\t\t\t/**=anon
\t\t\t/<value>
\t\t/<property>
\t/<bean>
/<beans>

創建自定義的realm

shiro教程5(整合SSM項目-認證)

完成service和mapper

shiro教程5(整合SSM項目-認證)

完成realm的認證功能

/**
* 認證方法
*
* @param token
* 就是我們在測試代碼中 定義的UsernamePasswordToken對象 有我們保存的需要驗證的賬號密碼信息
*/
@Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
\t// 獲取賬號信息

\tString principal = (String) token.getPrincipal();
\t// 正常邏輯此處應該根據賬號去數據庫中查詢,此處我們默認賬號為 root 密碼123456
\t// 驗證賬號
\tUsers user = userService.login(principal);
\tif (user == null) {
\t\treturn null;
\t}
\t// 獲取密碼
\tString pwd = user.getPassword();
\t// 獲取鹽值
\tByteSource bs = ByteSource.Util.bytes(user.getSalt());
\t// 驗證密碼
\tAuthenticationInfo info = new SimpleAuthenticationInfo(principal
\t\t\t, pwd, bs, "myrealm");
\treturn info;
}

完成controller

/**
* 認證方法
*
* @param token
* 就是我們在測試代碼中 定義的UsernamePasswordToken對象 有我們保存的需要驗證的賬號密碼信息
*/
@Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
\t// 獲取賬號信息
\tString principal = (String) token.getPrincipal();
\t// 正常邏輯此處應該根據賬號去數據庫中查詢,此處我們默認賬號為 root 密碼123456
\t// 驗證賬號
\tUsers user = userService.login(principal);
\tif (user == null) {
\t\treturn null;
\t}
\t// 獲取密碼
\tString pwd = user.getPassword();

\t// 獲取鹽值
\tByteSource bs = ByteSource.Util.bytes(user.getSalt());
\t// 驗證密碼
\tAuthenticationInfo info = new SimpleAuthenticationInfo(principal
\t\t\t, pwd, bs, "myrealm");
\treturn info;
}

準備數據

login.jsp

shiro教程5(整合SSM項目-認證)

測試

賬號錯誤

shiro教程5(整合SSM項目-認證)

shiro教程5(整合SSM項目-認證)

shiro教程5(整合SSM項目-認證)

密碼錯誤

shiro教程5(整合SSM項目-認證)

shiro教程5(整合SSM項目-認證)

shiro教程5(整合SSM項目-認證)

賬號密碼正確的情況

shiro教程5(整合SSM項目-認證)

shiro教程5(整合SSM項目-認證)

執行的原理過程

shiro教程5(整合SSM項目-認證)

文字描述

1.客戶端提交的請求到來的時候,首先過濾器會判斷該請求是否可以匿名訪問,如果不可以,則判斷當前是否是登錄狀態,如果不是就會跳轉到如下地址中:

shiro教程5(整合SSM項目-認證)

2.如果用戶請求的是可以匿名訪問的地址,比如login.jsp那麼服務器就會直接響應該請求

shiro教程5(整合SSM項目-認證)

3.如果請求的地址是 login.do那麼該請求會被過濾器攔截,並進行登錄認證。因為該請求我們特別配置了

shiro教程5(整合SSM項目-認證)

FormAuthenticationFilter該過濾器會獲取表單提交的內容,

shiro教程5(整合SSM項目-認證)

4.認證出錯,需要表單提交的賬號和密碼為username和password。
之後會被我們自定義的Realm認證,如果認證出錯,會將錯誤信息保存在request作用域中key為shiroLoginFailure,

shiro教程5(整合SSM項目-認證)

並跳轉到controller的login.do方法中。

shiro教程5(整合SSM項目-認證)

5.認證成功,會跳轉到我們指定的成功頁面,

shiro教程5(整合SSM項目-認證)

shiro教程5(整合SSM項目-認證)

內置過濾器介紹

內置過濾器對應關係

shiro教程5(整合SSM項目-認證)

內置過濾器說明

shiro教程5(整合SSM項目-認證)


分享到:


相關文章: