SpringMVC整合Shiro


第一部分:SpringMVC框架的配置

配置步驟說明

  (1)導入依賴的Jar包

  (2)構建一個請求的界面

  (3)創建業務控制器

  (4)配置 web.xml 的核心控制器

  (5)創建配置文件

  (6)構建一個返回界面

第一步:導入依賴的Jar包

  

第二步:構建一個請求界面

 1 <%@ page language="java" contentType="text/html; charset=UTF-8"
 2     pageEncoding="UTF-8"%>
 3 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
 4 <html>
 5 <head>
 6 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 7 <title>Insert title here</title>
 8 </head>
 9 <body>
10   <a href="${pageContext.request.contextPath }/admin/addAdmin">addAdmin</a>
11 </body>
12 </html>

第三步:創建業務控制器

 1 package cn.mgy.controller;
 2 
 3 import org.springframework.stereotype.Controller;
 4 import org.springframework.web.bind.annotation.RequestMapping;
 5 import org.springframework.web.context.annotation.SessionScope;
 6 
 7 @Controller
 8 @SessionScope
 9 @RequestMapping(value="admin")
10 public class AdminController {
11     
12     @RequestMapping(value="/addAdmin")
13     public String addAdmin(){
14         System.out.println("=增加管理員=");
15         return "/index.jsp";
16     }
17 
18 }

第四步:配置 web.xml 的核心控制器

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 3     xmlns="http://xmlns.jcp.org/xml/ns/javaee"
 4     xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
 5     id="WebApp_ID" version="3.1">
 6     <display-name>shiro-demo-08-springmvc</display-name>
 7 
 8     <!-- 配置核心控制器。攔截器所有的請求 -->
 9     <servlet>
10         <servlet-name>dispatcherServlet</servlet-name>
11         <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
12         <!-- 指定配置文件的路徑 -->
13         <init-param>
14           <param-name>contextConfigLocation</param-name>
15           <param-value>classpath:spring-*.xml</param-value>
16         </init-param>
17         <!-- 配置啟動的時候就創建對象 -->
18         <load-on-startup>1</load-on-startup>
19     </servlet>
20     <servlet-mapping>
21         <servlet-name>dispatcherServlet</servlet-name>
22         <url-pattern>/</url-pattern>
23     </servlet-mapping>
24 
25     <welcome-file-list>
26         <welcome-file>index.jsp</welcome-file>
27     </welcome-file-list>
28 </web-app>

第五步:創建配置文件

---- SpringMVC 配置文件, spring-mvc.xml

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <beans xmlns="http://www.springframework.org/schema/beans"
 3     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 4     xmlns:mvc="http://www.springframework.org/schema/mvc"
 5     xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
 6         http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.3.xsd">
 7 
 8    <!-- 啟動默認注解支持 -->
 9    <mvc:annotation-driven />
10    <!-- 放開靜態資源訪問 -->
11    <mvc:default-servlet-handler/>
12 
13 </beans>

---- Spring 容器配置文件,spring-context.xml

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <beans xmlns="http://www.springframework.org/schema/beans"
 3     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 4     xmlns:context="http://www.springframework.org/schema/context"
 5     xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
 6         http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd">
 7 
 8   <!-- 掃描組件配置 -->
 9   <context:component-scan base-package="cn.mgy" />
10 </beans>

 

第二部分:Shiro 框架的配置

配置步驟說明:

  (1)導入依賴的 Jar 包

  (2)創建 Shiro.ini 配置文件

  (3)創建一個入口測試類

  (4)創建一個 Realm

第一步:導入依賴的 Jar 包

  

第二步:創建 Shiro.ini 配置文件

[users]
  admin = 123456,adminRole
[roles]
  adminRole = admin:list,admin:add,admin:delete,admin:edit 

第三步:創建一個入口測試類

 1 package cn.mgy.shiro.test;
 2 
 3 import org.apache.shiro.SecurityUtils;
 4 import org.apache.shiro.authc.UsernamePasswordToken;
 5 import org.apache.shiro.config.IniSecurityManagerFactory;
 6 import org.apache.shiro.mgt.SecurityManager;
 7 import org.apache.shiro.subject.Subject;
 8 
 9 public class ShiroTest {
10     
11     
12     public static void main(String[] args) {
13         //第一步:加載ini配置文件,獲得SecurityManagerFactory對象
14         IniSecurityManagerFactory factory=new IniSecurityManagerFactory("classpath:shiro.ini");
15         //第二步:獲得SecurityManager對象
16         SecurityManager securityManager = factory.createInstance();
17         //第三步:獲得Subject身份對象
18         SecurityUtils.setSecurityManager(securityManager);
19         Subject subject = SecurityUtils.getSubject();
20         
21         //第四步:構建一個身份信息對象(Token)
22         UsernamePasswordToken token=new UsernamePasswordToken("admin","123456");
23     
24         //第五步:login操作。校驗權限
25         Subject resultSubject = securityManager.login(subject, token);
26         
27         //第六步:校驗是否成功
28         boolean  isAuth= resultSubject.isAuthenticated();
29         System.out.println(isAuth);
30         
31     }
32 
33 }

第四步:創建一個 Realm

---- 修改配置文件 shiro.ini

#[users]
#  admin = 123456,adminRole
#[roles]
#  adminRole = admin:list,admin:add,admin:delete,admin:edit   

[main]
  myRealm = cn.mgy.realm.MyRealm
  securityManager.realms=$myRealm

---- MyRealm 類

 1 package cn.mgy.realm;
 2 
 3 import org.apache.shiro.authc.AuthenticationException;
 4 import org.apache.shiro.authc.AuthenticationInfo;
 5 import org.apache.shiro.authc.AuthenticationToken;
 6 import org.apache.shiro.authc.SimpleAuthenticationInfo;
 7 import org.apache.shiro.authz.AuthorizationInfo;
 8 import org.apache.shiro.realm.AuthorizingRealm;
 9 import org.apache.shiro.subject.PrincipalCollection;
10 
11 public class MyRealm extends AuthorizingRealm {
12 
13     @Override
14     protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
15         System.out.println("=權限校驗=");
16         try {
17             if (token.getPrincipal().equals("admin")) {
18                 SimpleAuthenticationInfo info = new SimpleAuthenticationInfo(token.getPrincipal(), "123456",
19                         this.getName());
20                 return info;
21             }
22         } catch (Exception e) {
23             e.printStackTrace();
24         }
25 
26         return null;
27     }
28 
29     @Override
30     protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
31 
32         return null;
33     }
34 
35 }

第五步:測試結果

---- 運行 ShiroTest 測試類,結果為:

   

 

第三部分:SpringMVC 整合 Shiro (基於 XML)

1、說明

  (1)權限控制是對誰的控制? 就是對 url 訪問權限的控制

  (2)Filter 的優先級別高於 Servlet。而 Shiro 是使用 Filter 攔截的,SpringMVC 是使用 Servlet 攔截請求的。那么如何讓 Shiro 交給 SpringMVC 代理呢?

  答:Spring 提供了一個 Filter 代理類,可以讓 Spring 容器代理 Filter 的操作,該 Filter 代理是 DelegatingFilterProxy。實現了在過濾里面可以調用 Spring 容器的對象,把原來配置在 web.xml 的過濾器配置在 Spring 配置文件里面。

2、Shiro 提供的過濾器說明

  在 org.apache.shiro.web.filter.mgt.DefaultFilter 枚舉里面定義可以使用的過濾器以及對應的枚舉值

  anon:匿名過濾器,該過濾器的作用就是用於配置不需要授權就可以直接訪問的路徑

  authc:校驗過濾器,該過濾器的作用就是用於必須經過校驗才可以訪問的路徑(url)

  logout:注銷過濾器,該過濾器的作用就是用於注銷退出登錄

  perms:權限驗證過濾器,用於權限驗證的

3、配置步驟說明

  (1)在 web.xml 配置過濾器代理類 DelegatingFilterProxy,讓 Filter 交給 Spring 容器代理

  (2)創建一個 spring-shiro.xml 配置文件

第一步:配置 web.xml

 1 <filter>
 2   <filter-name>securityFilterBean</filter-name>
 3   <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
 4   <!-- 將生命周期交給Spring代理 -->
 5   <init-param>
 6      <param-name>targetFilterLifecycle</param-name>
 7      <param-value>true</param-value>
 8    </init-param>
 9 </filter>
10 <filter-mapping>
11     <filter-name>securityFilterBean</filter-name>
12     <url-pattern>/*</url-pattern>
13 </filter-mapping>

第二步:創建一個 spring-shiro.xml 配置文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

    <!-- 配置攔截器調用的對象 注意事項:bean的名字必須要和web.xml的DelegatingFilterProxy的過濾的name屬性一一對應。 -->
    <bean name="securityFilterBean" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
        <!-- 指定跳轉到校驗不成功的路徑 ,不指定會跳轉上一次訪問菜單頁面 -->
        <!-- <property name="unauthorizedUrl" value="/undo"></property> -->
        <!-- 指定依賴的securityManager對象 -->
        <property name="securityManager" ref="securityManager"></property>
        <!-- 指定 登錄請求的路徑 -->
        <property name="loginUrl" value="/admin/loginAdmin"></property>
        <!-- 登錄成功跳轉的路徑 -->
        <property name="successUrl" value="/index"></property>
        <!-- 用於指定執行的過濾器鏈 ,配置多個過濾器連接對的url -->
        <property name="filterChainDefinitions">
            <value>
                <!-- 指定url與過濾器的關系 -->
                <!-- 所有的路徑都要攔截 -->
                /admin/toLogin = anon
                /** = authc
            </value>
        </property>

    </bean>

    <!-- 2.指定securityManager的對象 -->
    <bean name="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">

        <property name="realm" ref="myRealm" />

    </bean>

    <!-- 3.創建一個Realm對象 -->
    <bean name="myRealm" class="cn.mgy.realm.MyRealm"></bean>
    
    <!-- 4.Spring容器對shiro生命周期的管理 ,基於注解權限攔截需要配置-->
    <bean name="lifecycleBeanPostProcessor" class="org.apache.shiro.spring.LifecycleBeanPostProcessor"></bean>
    <bean class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator" depends-on="lifecycleBeanPostProcessor"/>

</beans>

 

第三部分:SpringMVC 整合 Shiro(基於注解)

第一步:配置 web.xml

 1 <filter>
 2       <filter-name>securityFilterBean</filter-name>
 3     <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
 4       <!-- 將生命周期交給Spring代理 -->
 5       <init-param>
 6         <param-name>targetFilterLifecycle</param-name>
 7         <param-value>true</param-value>
 8       </init-param>
 9     </filter>
10     <filter-mapping>
11        <filter-name>securityFilterBean</filter-name>
12       <url-pattern>/*</url-pattern>
13     </filter-mapping>

第二步:配置 Shiro 配置類

 1 package cn.mgy.config;
 2 
 3 import java.util.LinkedHashMap;
 4 import java.util.Map;
 5 
 6 import org.apache.shiro.spring.web.ShiroFilterFactoryBean;
 7 import org.apache.shiro.web.mgt.DefaultWebSecurityManager;
 8 import org.springframework.context.annotation.Bean;
 9 import org.springframework.context.annotation.Configuration;
10 
11 import cn.mgy.realm.ShiroRealm;
12 
13 @Configuration
14 public class ShiroConfig {
15     
16     //1.配置securityFilterBean對象
17     @Bean(name="securityFilter")
18     public Object getShiroFilterFactory() {
19         ShiroFilterFactoryBean factory=new ShiroFilterFactoryBean();
20         
21         //設置屬性
22         factory.setLoginUrl("/login");
23         factory.setSuccessUrl("/index");
24         factory.setSecurityManager(this.getSecurityManager());
25         //基於配置的權限過濾器,順序執行,所以使用LinkedHashMap
26         Map<String, String> filterChainDefinition=new LinkedHashMap<>();
27         filterChainDefinition.put("/**", "authc");
28         factory.setFilterChainDefinitionMap(filterChainDefinition);
29     
30         Object securityFilter=null;
31         try {
32             securityFilter = factory.getObject();
33         } catch (Exception e) {
34             e.printStackTrace();
35         }
36         return securityFilter;
37     }
38     
39     //2.獲得securityManager對象
40     @Bean(name="securityManager")
41     public DefaultWebSecurityManager getSecurityManager() {
42         DefaultWebSecurityManager securityManager=new DefaultWebSecurityManager();
43         //設置需要的realm對象
44         securityManager.setRealm(this.getRealm());
45         return securityManager;
46     }
47     
48     //3.配置realm對象
49     @Bean
50     public ShiroRealm getRealm(){
51         ShiroRealm realm=new ShiroRealm();
52         return realm;
53     }
54 
55 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM