1. 程式人生 > >shiro學習:shiro整合SpringMVC的web專案

shiro學習:shiro整合SpringMVC的web專案

這篇文章只是介紹了shiro與springweb專案進行的整合,並沒有涉及到認證的實現,如果您需要認證的相關實現,請看下我的下一篇:Shiro實現登入和退出

一、準備環境

與其它java開源框架類似,將shiro的jar包加入專案就可以使用shiro提供的功能了。shiro-core是核心包必須選用,還提供了與web整合的shiro-web、與spring整合的shiro-spring、與任務排程quartz整合的shiro-quartz等,下邊是shiro各jar包的maven座標。

<dependency>
			<groupId>org.apache.shiro</groupId>
			<artifactId>shiro-core</artifactId>
			<version>1.2.3</version>
		</dependency>
		<dependency>
			<groupId>org.apache.shiro</groupId>
			<artifactId>shiro-web</artifactId>
			<version>1.2.3</version>
		</dependency>
		<dependency>
			<groupId>org.apache.shiro</groupId>
			<artifactId>shiro-spring</artifactId>
			<version>1.2.3</version>
		</dependency>
		<dependency>
			<groupId>org.apache.shiro</groupId>
			<artifactId>shiro-ehcache</artifactId>
			<version>1.2.3</version>
		</dependency>
		<dependency>
			<groupId>org.apache.shiro</groupId>
			<artifactId>shiro-quartz</artifactId>
			<version>1.2.3</version>
		</dependency>
二、配置檔案

2.1web.xml新增shiro Filter

建議將filter-mapping放在其他filter-mapping的上邊,便於第一次執行shiro的filter

<!-- shiro過慮器,DelegatingFilterProxy通過代理模式將spring容器中的bean和filter關聯起來 -->
	<filter>
		<filter-name>shiroFilter</filter-name>
		<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
		<!-- 設定true由servlet容器控制filter的生命週期 -->
		<init-param>
			<param-name>targetFilterLifecycle</param-name>
			<param-value>true</param-value>
		</init-param>
		<!-- 設定spring容器filter的bean id,如果不設定則找與filter-name一致的bean-->
		<init-param>
			<param-name>targetBeanName</param-name>
			<param-value>shiroFilter</param-value>
		</init-param>
	</filter>
	<filter-mapping>
		<filter-name>shiroFilter</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>


2.2配置application-shiro.xml

注意:自動realm的路徑一定要用我們自己建立的realm路徑

<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mvc="http://www.springframework.org/schema/mvc"
	xmlns:context="http://www.springframework.org/schema/context"
	xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
	xsi:schemaLocation="http://www.springframework.org/schema/beans 
		http://www.springframework.org/schema/beans/spring-beans-3.2.xsd 
		http://www.springframework.org/schema/mvc 
		http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd 
		http://www.springframework.org/schema/context 
		http://www.springframework.org/schema/context/spring-context-3.2.xsd 
		http://www.springframework.org/schema/aop 
		http://www.springframework.org/schema/aop/spring-aop-3.2.xsd 
		http://www.springframework.org/schema/tx 
		http://www.springframework.org/schema/tx/spring-tx-3.2.xsd ">
	
	<!-- web.xml中shiro的filter需要的bean -->
	<!-- Shiro 的Web過濾器 -->
	<bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
		<property name="securityManager" ref="securityManager" />
		<!-- loginUrl認證提交地址,如果沒有認證將會請求此地址進行認證,請求此地址將由formAuthenticationFilter進行表單認證 -->
		<property name="loginUrl" value="/login.do" />
		<!-- 認證成功同意跳轉到first.action 建議不要配置,shiro自動到上一個請求路徑 -->
		<property name="successUrl" value="/index.do" />
		<!-- 通過unauthorizedUrl指定沒有許可權操作時的許可權頁面 -->
		<property name="unauthorizedUrl" value="/refuse.jsp" />
		
		<!-- 過慮器鏈定義,從上向下順序執行,一般將/**放在最下邊 -->
		<property name="filterChainDefinitions">
			<value>
			<!-- 對靜態資源設定匿名訪問 -->
			/images/** = anon
			/js/** = anon
			/styles/** = anon
			
			<!--/** = authc 所有的url都授權後才能訪問  -->
			/** = authc
			
			</value>
		</property>
	</bean>
	<!-- SecurityManager -->
	<!-- 安全管理器 -->
	<bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
		<!-- 注入自定義realm -->
		<property name="realm" ref="customRealm" />
	</bean>

	<!-- 自定義 realm -->
	<bean id="customRealm" class="org.lpl.controller.shiro.CustomRealm">
	</bean>
	 
</beans>

2.3自定義realm

public class CustomRealm extends AuthorizingRealm {

	@Override
	protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
		System.out.println("shiror認證");
		return null;
	}

}
2.4登入controller

因為我們在shiro的配置檔案中配置瞭如果沒有認證就會跳到login.do這個controller,通過這個controller我們就將將沒有認證的讓他去登入頁面

@Controller
public class LoginCotroller {
	/**
	 * 此方法只處理登入失敗,如果登入成功shiro會自動跳轉到上一個請求路徑
	 * @param request
	 * @return
	 * @throws Exception
	 */
	@RequestMapping("login.do")//這個路徑要和shiro.xml配置的路徑要一樣
	public String login(HttpServletRequest request) throws Exception{
		
		return "login";
	}
}

三、測試

直接訪問我們的專案路徑(例如:localhost:8080/SSMShiro),如果自己跳到登入頁面說明成功


四、我的目錄結構: