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:叢集分配關係:masterJobTracker&&Namenode node1Secondarynamenode node2TaskTracker
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