1. 程式人生 > >Shiro的兩種配置方式

Shiro的兩種配置方式

Apache Shiro是一款Java 安全框架,可以用於完成認證、授權、加密、會話管理、與Web整合、快取等功能。根據官方文件,我這裡列舉出兩種常用的配置方式,一是ini檔案配置,二是spring xml檔案的配置方式。
二者的配置,基本都是針對Shiro的以下幾個常用元件:securityManager,cachManager,Realm,以及對應的連結攔截規則(urls)。
1. shiro.ini檔案配置方式
我所用的是IDEA環境,在resources目錄下新建config目錄,用於存放相關配置檔案,這裡的Shiro.ini 檔案也放在下面。你也可以放在你自己的目錄,只不過要在web.xml指明配置檔案的路徑(預設為classpath下shiro.ini檔案)。
shiro.ini檔案的基本內容:這裡的[urls]下anon代表對應連結不需要使用者登入以及許可權即可訪問,authc代表需要使用者登入才可以訪問,其他標籤可檢視官方文件,在之後的學習過程中,根據例項再續寫。

[main]
cacheManager = org.apache.shiro.cache.MemoryConstrainedCacheManager
securityManager.cacheManager = $cacheManager

myShiroRealm = com.song.shiro.realm.MyRealm
myShiroRealm.cacheManager = $cacheManager

securityManager.realm = $myShiroRealm

securityManager.rememberMeManager.cipherKey=false

shiro.loginUrl
= /admin/login shiro.successUrl = /admin/success [urls] /admin/login = anon /admin/success = authc /other/index = authc /logout = logout

對應地,在web.xml中配置檔案載入監聽器及對應的Shiro攔截器配置為:

  <context-param>
    <param-name>shiroConfigLocations</param-name>
    <param-value>classpath:config/shiro.ini</param-value
>
</context-param> <listener> <listener-class>org.apache.shiro.web.env.EnvironmentLoaderListener</listener-class> </listener> <filter> <filter-name>shiroFilter</filter-name> <filter-class>org.apache.shiro.web.servlet.ShiroFilter</filter-class> </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>

2. spring xml檔案配置方式:
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-3.0.xsd"
       default-lazy-init="true">

    <description>Shiro Configuration</description>

    <bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
        <property name="securityManager" ref="securityManager"/>
        <property name="loginUrl" value="/admin/index" />
        <property name="successUrl" value="/admin/success" />
        <property name="unauthorizedUrl" value="/error" />
        <property name="filterChainDefinitions">
            <value>
                /admin/login = anon
                /admin/success = authc
                /other/index = authc
                /logout = logout
                /** = anon
            </value>
        </property>
    </bean>
    <!-- 使用者授權資訊Cache -->
    <bean id="cacheManager" class="org.apache.shiro.cache.MemoryConstrainedCacheManager" />

    <bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
        <property name="realm" ref="myRealm"/>
        <property name="cacheManager" ref="cacheManager" />
    </bean>
    <bean id="lifecycleBeanPostProcessor" class="org.apache.shiro.spring.LifecycleBeanPostProcessor"/>

    <!-- Define the Shiro Realm implementation you want to use to connect to your back-end -->
    <!-- security datasource: -->
    <bean id="myRealm" class="com.song.shiro.realm.MyRealm">
        <property name="cacheManager" ref="cacheManager" />
    </bean>

    <!-- Enable Shiro Annotations for Spring-configured beans.  Only run after -->
    <!-- the lifecycleBeanProcessor has run: -->
    <bean class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator" depends-on="lifecycleBeanPostProcessor"/>
    <bean class="org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor">
        <property name="securityManager" ref="securityManager"/>
    </bean>

</beans>

對應地,web.xml中載入監聽器以及Shiro過濾器的配置如下:

  <context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath:config/applicationContext.xml,classpath:config/spring-shiro1.xml</param-value>
  </context-param>
  <listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  </listener>
  <filter>
    <filter-name>shiroFilter</filter-name>
    <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
    <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>

3. 說明
以上兩種方式給出的配置,一般來說,對於實際web工程,只需要改動ini中的[urls]部分或者spring-xml中的shiroFilter配置部分。即定義web資源對應的操作控制權限。具體的語法以及分類,在接下來的具體實踐中,再根據例項說明。
另外,配置檔案中關於Realm的配置中時使用的MyRealm,這個是自己寫的Realm,用於提供使用者名稱稱密碼、角色、許可權等封裝資訊的介面,以下是測試用例中的具體的實現(來源於網路,測試通過),其具體呼叫系統呼叫Shiro使用者登入介面(subject.login(user))時觸發:

/**
 * Created by Song on 2016/12/27.
 */
public class MyRealm extends AuthorizingRealm {
    //這裡因為沒有呼叫後臺,直接預設只有一個使用者("spf","123456")
    private static final String USER_NAME = "spf";
    private static final String PASSWORD = "123456";

    @Override
    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
        Set<String> roleNames = new HashSet<String>();
        Set<String> permissions = new HashSet<String>();
        roleNames.add("admin");//新增角色
        permissions.add("read");  //新增許可權
        SimpleAuthorizationInfo info = new SimpleAuthorizationInfo(roleNames);
        info.setStringPermissions(permissions);
        return info;
    }

    @Override
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {
        UsernamePasswordToken token = (UsernamePasswordToken) authenticationToken;
        if(token.getUsername().equals(USER_NAME)){
            return new SimpleAuthenticationInfo(USER_NAME, MD5Util.MD5(PASSWORD), getName());
        }else{
            throw new AuthenticationException();
        }
    }
}

測試中用到的login.jsp頁面(登入框):這裡直接通過action提交表單,便於後臺直接跳轉頁面,當然你也可以採用js Ajax提交請求,這樣的話,就只能通過js根據返回的資料體進行頁面跳轉。

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<html>
<head>
    <script typet="text/javascript" src="http://libs.baidu.com/jquery/1.9.1/jquery.min.js"></script>
</head>
<body>
<form action="<%=request.getContextPath()%>/admin/checkLogin">
    <input type="text" name="username" ><br><br>
    <input type="password" name="password"><br><br>
    <input type="checkbox" name="rememberMe" value="true"/>Remember Me?<br>
    <button type="submit" id="loginbtn">登入</button>
</form>
</body>

對應的/admin/checkLogin使用者登入驗證程式碼如下:

    /**
     * 驗證使用者名稱和密碼
     * @param  username,String password
     * @return
     */
    @RequestMapping(value="/checkLogin")
    public String checkLogin(String username, String password, ServletRequest request) {
        Map<String, Object> result = new HashMap<String, Object>();
        try{
            UsernamePasswordToken token = new UsernamePasswordToken(username, MD5Util.MD5(password));
            Subject currentUser = SecurityUtils.getSubject();
            if (!currentUser.isAuthenticated()){
                //使用shiro來驗證
                token.setRememberMe(true);
                currentUser.login(token);//驗證角色和許可權
                //獲取本來要訪問的網址uri
                String uri = WebUtils.getSavedRequest(request).getRequestUrl();
                //去掉工程名shiros
                if(uri.split("/shiros").length>1)
                    return "redirect:"+uri.split("/shiros")[1];
            }
        }catch(Exception e){
            e.printStackTrace();
        }
        return "redirect:/admin/success";
    }

相關推薦

Shiro配置方式

Apache Shiro是一款Java 安全框架,可以用於完成認證、授權、加密、會話管理、與Web整合、快取等功能。根據官方文件,我這裡列舉出兩種常用的配置方式,一是ini檔案配置,二是spring xml檔案的配置方式。 二者的配置,基本都是針對Shir

記錄下log4j的配置方式

ole num div resolv ade true uil data- range XML文件配置 <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE log4j:configur

java框架篇---spring aop配置方式

system 操作類 asp xml文件 ack ica one pack exc 第一種:註解配置AOP 註解配置AOP(使用 AspectJ 類庫實現的),大致分為三步: 1. 使用註解@Aspect來定義一個切面,在切面中定義切入點(@Pointcut),通知類型(@

cron 定時任配置方式

card 任務 init 1-1 rop java代碼 exp tor date 第一種:xml文件方式 <bean id="commonTimer" class="com.course.wx.timer.CommonTimer"></bean&

Oozie與Coordinator調度講解及系統時區配置與定時觸發配置方式

-- track eno star es2017 alt coo 之前 res 1:修改本地linux時區 查看時區 - 號代表西 + 號 代表東 北京時間是東八區 設置時區的配置文件所在位置 1 cd /usr/share/zoneinfo/

spring AOP的配置方式

can 之前 top () 就是 記錄 string -s 服務   連接點(JoinPoint) ,就是spring允許你是通知(Advice)的地方,那可就真多了,基本每個方法的前、後(兩者都有也行),或拋出異常是時都可以是連接點,spring只支持方法連接點。其

springboot之jackson的配置方式

test erb missing lan ica res mar 忽略 說明 springboot 針對jackson是自動化配置的,如果需要修改,有兩種方式: 方式一:通過application.yml 配置屬性說明:## spring.jackson.date-form

第四節:框架前期準備篇之進程外Session的配置方式

connect 也會 strong 缺點 col 客戶端 配置 ott 小學生 一. 基本介紹 1. 背景:Asp.Net默認的Session機制是進程內,存儲在服務器端內存中,有這麽幾個缺點:   ①:既然存在內存中,空間有限,不能存儲大數據量信息,數據量多的話S

ibatis一對多對映查詢的配置方式

 方式一: <sqlMap namespace="author"> <typeAlias alias="author" type="Author" /> <typeAlias alias="book" type="Book" />

SSM整合配置方式——xml和javaConfig,新增分頁外掛pageHelper和通用Mapper

Spring MVC配置 1. xml方式 web.xml <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"  

Spring配置方式

Spring有兩種配置方式,分別為XML配置與java檔案配置,其實兩者本質上是一模一樣的,只不過用java檔案配置的好處是少了一個讀檔案的過程,可以將兩種配置方式結合對應起來總結。 首先了解一下Spring配置需要配置哪些東西: 1.前端控制器 DispatcherServlet 2.

設定Windows防火牆以允許被ICMP Ping(配置方式

本文由荒原之夢原創,原文連結:http://zhaokaifeng.com/?p=1119 背景與目的 Ping測試常被用於測試網路中兩臺主機之間是否互相連通,但是,大多數Windows作業系統(包括桌面版和伺服器版)預設都是隻允許ping其他主機而不允許其他主機ping自己。下

SpringBoot的properties和yml配置方式, 配置注入引數, 以及配置檔案讀取失效的問題

SpringBoot支援兩種配置方式,一種是properties檔案,一種是yml 首先在pom檔案中新增依賴: <dependency> <groupId>org.springframework.boot</gro

Axis2 service.xml釋出webservice 配置方式

如下例子 package com.wm5920.webservice; public class HelloService { public String s

javaWeb基礎之Servlet的三實現方式以及配置方式

一、Servlet的三種實現方式 Servlet(Server Applet)是Java Servlet的簡稱,稱為小服務程式或服務聯結器,用Java編寫的伺服器端程式,主要功能在於互動式地瀏覽和修改資料,生成動態Web內容。 1、Servlet的第一種建立方式:繼承Ht

spring Ioc的註解注入以及spring Aop的配置方式

1.spring Ioc的註解注入    1.1 導包            1.2 匯入約束                    1.3 選擇使用註解的包                  1.4 在類中使用註解配置bean                User類//

Servlet的配置方式

在Servlet2.5規範之前,Java Web應用的絕大部分元件都通過web.xml檔案來配置管理,Servlet3.0規範可通過Annotation來配置管理Web元件,因此web.xml檔案可以變得更加簡潔,這也是Servlet3.0的重要簡化。 兩種方式 (1),通

Hadoop secondarynamenode配置方式

hadoop secondarynamenode的兩種配置方式,hadoop版本是hadoop-1.0.4:叢集分配關係:masterJobTracker&&Namenode node1Secondarynamenode node2TaskTracker

spring定時器的配置方式

 1、加入依賴包: <dependency> <groupId>org.quartz-scheduler</groupId> <artifact

配置adpater的方式

and adapt source ada ray har spin cad layout 第一種:資源文件配置 ArrayAdapter<CharSequence> cadapt=ArrayAdapter.createFromResource(this, 資源i