Shiro在SSM框架中的應用

上一篇Shiro基礎的鏈接 html

 若是想使用Relam的操做,那麼必需要保證有一個具體的認證類實現了Relam接口java

web.xml增長shiro的配置

    <!-- 進行shiro的過濾器的配置 -->
    <filter>
        <filter-name>shiroFilter</filter-name>
        <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
        <!-- 該參數表示shiro的生命週期將交由Spring容器進行管理(默認狀況下,取值爲false) -->
        <!-- 若是將其內容設置爲true,則表示由Servlet容器進行管理 -->
        <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>
        <dispatcher>REQUEST</dispatcher>
        <dispatcher>FORWARD</dispatcher>
        <dispatcher>INCLUDE</dispatcher>
        <dispatcher>ERROR</dispatcher>
    </filter-mapping>
    <welcome-file-list>
        <welcome-file>login.jsp</welcome-file>
    </welcome-file-list>

在applicationContext.xml加入shiro配置項信息

配置shiro的登陸入口web

    <!-- 此處表示使用內置的表單登陸控制驗證 -->
    <bean id="formAuthenticationFilter" class="com.sk.shiro.MyFormAuthenticationFilter">
        <!-- 定義出須要使用的參數,此參數與表單一一對應 -->
        <property name="usernameParam" value="username"/>
        <property name="passwordParam" value="password"/>
        <!-- <property name="loginUrl" value="/login.jsp"/> 不用配置 默認是這個 -->
    </bean>  

    配置Shiro過濾器spring

    <!-- 配置shiro過濾器 -->
    <bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
        <!-- 表示如今要配置的是一個安全管理器 -->
        <property name="securityManager" ref="securityManager"/>
        <!-- 登陸成功以後的跳轉訪問路徑 -->
        <property name="successUrl" value="/index.jsp"/>
        <!-- 配置shiro裏面須要使用到的過濾器操做 -->
        <property name="filters">
            <map>
                <entry key="authc" value-ref="formAuthenticationFilter"/>
            </map>
        </property> 

        <!-- shiro裏面須要針對於全部的路徑進行配置,全部的配置須要經過文本的形式設置 -->
        <property name="filterChainDefinitions">
            <value>
                /login.jsp=authc<!--loginUrl 須要和loginUrl一致  -->
                /successUrl=authc
                 /test/*=user 
                /test*=user  
            </value>
        </property>
    </bean> 

   配置SecurityManager管理器apache

    <!-- 配置SecurityManager的管理 -->
    <bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
        <!-- 配置你須要使用的Realms -->
        <property name="realms">
            <list>
                <ref bean="usernamePasswordRealm"/>
            </list>
        </property>
        <!-- 定義要使用的session管理器 -->
        <property name="sessionManager" ref="sessionManager"/>
    </bean>

編寫UsernamePasswordRealm進行認證受權

package com.sk.shiro;

import java.util.HashSet;
import java.util.Set;

import org.apache.shiro.authc.AuthenticationInfo;
import org.apache.shiro.authc.AuthenticationToken;
import org.apache.shiro.authc.SimpleAuthenticationInfo;
import org.apache.shiro.authc.UnknownAccountException;
import org.apache.shiro.authz.AuthorizationInfo;
import org.apache.shiro.authz.SimpleAuthorizationInfo;
import org.apache.shiro.realm.AuthorizingRealm;
import org.apache.shiro.subject.PrincipalCollection;

public class UsernamePasswordRealm extends AuthorizingRealm {
    
    @Override
    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
        System.out.println("********** 二、用戶角色與權限:doGetAuthorizationInfo **********");
        String username = (String) principals.getPrimaryPrincipal() ;    // 取得用戶登陸名
        SimpleAuthorizationInfo auth = new SimpleAuthorizationInfo() ;    // 定義受權信息的返回數據
        try {
            Set<String> allRoles = new HashSet<>();
            allRoles.add("admin");
            Set<String> allActions =  new HashSet<>();
            auth.setRoles(allRoles);// 全部的角色必須以Set集合的形式出現
            auth.setStringPermissions(allActions);     // 全部的權限必須以Set集合的形式出現
        } catch (Exception e) {
            e.printStackTrace(); 
        } 
        return auth;
    }
    @Override
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) {
        System.out.println("********** 一、用戶登陸認證:doGetAuthenticationInfo() **********");
        // 一、登陸認證的方法須要先執行,須要用他來判斷登陸的用戶信息是否合法
        String username = (String) token.getPrincipal() ;    // 取得用戶名
        if(!"admin".equals(username)) {
            throw new UnknownAccountException("用戶名不存在");
        }
        // 須要經過用戶名取得用戶的完整信息,利用業務層操做
        String password = (String) token.getCredentials();
        System.err.println("密碼"+password);
        AuthenticationInfo auth = new SimpleAuthenticationInfo(username, password, "myRealm") ;
        return auth ;
    } 
    @Override
    public boolean supports(AuthenticationToken token) {
        MyAuthenticationToken t=null;
        try {
             t = (MyAuthenticationToken) token;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return t.getLoginType() == LoginType.USERNAME_PASSWORD;
    }
}
View Code
這是首頁登陸的jsp
<%@ page language="java" contentType="text/html; charset=utf-8"
    pageEncoding="utf-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"//"+request.getServerName()+":"+request.getServerPort();
%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<%-- <base href="<%=basePath %>"> --%>
<%System.out.println("---"+basePath); %>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Shiro</title>
</head>
<body>
    <form action="/login.jsp" method = "post">
    用戶名<input type="text" name = "username" id = "username"><br>
    密碼 <input type="password" name = "password" id = "password"><br>
    <input type="hidden" name = "loginType" value = "USERNAME_PASSWORD">
    <input type="submit" value="登陸">
    <input type="reset" value="重置">
    </form>
</body>
</html>

shiro登陸的流程

從登錄的jsp的action找到配置的formAuthenticationFilter(此接口中有createToken等方法 根據登錄方式可使用自定義token 實現HostAuthenticationToken, RememberMeAuthenticationToken接口 能夠自定義token )api

而後登陸的路徑被shiroFilter過濾安全

shiroFilter交給配置的securityManager去管理session

securityManager又交給配置的usernamePasswordRealm去受權和認證(supports()方法返回true表明使用這個Realm去認證 此處爲了兼容多種登錄方式 好比手機驗證碼、用戶名密碼 等)app

登陸成功以後的跳轉訪問路徑 jsp

<property name="successUrl" value="/index.jsp"/>

下一篇會寫在集羣環境下Shiro的Session管理

相關文章
相關標籤/搜索