最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Spring Security如何使用URL地址進(jìn)行權(quán)限控制

 更新時間:2019年12月12日 08:30:44   作者:二刀  
這篇文章主要介紹了Spring Security如何使用URL地址進(jìn)行權(quán)限控制,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下

這篇文章主要介紹了Spring Security如何使用URL地址進(jìn)行權(quán)限控制,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下

目的是:系統(tǒng)內(nèi)存在很多不同的用戶,每個用戶具有不同的資源訪問權(quán)限,具體表現(xiàn)就是某個用戶對于某個URL是無權(quán)限訪問的。需要Spring Security忙我們過濾。

FilterSecurityInterceptor是Spring Security進(jìn)行URL權(quán)限判斷的,F(xiàn)ilterSecurityInterceptor又繼承于AbstractSecurityInterceptor,由此可推測,我們可以新增一個Interceptor繼承AbstractSecurityInterceptor,實現(xiàn)我們自己的權(quán)限校驗邏輯。

查看父類及其代碼邏輯,有幾點必須要注意:

1、主要鑒權(quán)方法是調(diào)用父類中accessDecisionManager的decide值,所以我們需要自己實現(xiàn)一個accessDecisionManager

2、父類中存在抽象方法public abstract SecurityMetadataSource obtainSecurityMetadataSource();作用是獲取URL及用戶角色對應(yīng)的關(guān)系。我們需要加入自己的實現(xiàn)。

以下是部分代碼實現(xiàn)

主要攔截器JwtUrlSecurityInterceptor,需要在WebSecurityConfig(Spring Security配置)文件中注冊

//這個攔截器用來實現(xiàn)按照用戶權(quán)限,對所請求的url進(jìn)行攔截
@Bean
  public JwtUrlSecurityInterceptor jwtUrlSecurityInterceptorBean() throws Exception{
	return new JwtUrlSecurityInterceptor();
}
@Override
  protected void configure(HttpSecurity httpSecurity) throws Exception {
	...
	    httpSecurity.addFilterBefore(jwtUrlSecurityInterceptorBean(), FilterSecurityInterceptor.class);
	...
}

實現(xiàn)自定義的accessDecisionManager

package org.zerhusen.security.dsuri;
import org.springframework.security.access.AccessDecisionManager;
import org.springframework.security.access.AccessDeniedException;
import org.springframework.security.access.ConfigAttribute;
import org.springframework.security.authentication.InsufficientAuthenticationException;
import org.springframework.security.core.Authentication;
import java.util.Collection;
/**
 * Created by dingshuo on 2017/6/28.
 */
public class MyAccessDecisionManager implements AccessDecisionManager {
	@Override
	  public void decide(Authentication authentication, Object object, Collection<ConfigAttribute> configAttributes) throws AccessDeniedException, InsufficientAuthenticationException {
		System.out.println("自定義的接口");
		throw new AccessDeniedException("no right");
	}
	@Override
	  public Boolean supports(ConfigAttribute attribute) {
		return true;
	}
	@Override
	  public Boolean supports(Class<?> clazz) {
		return true;
	}
}

實現(xiàn)自定義的資源SecurityMetadataSource

package org.zerhusen.security.dsuri;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.ConfigAttribute;
import org.springframework.security.access.SecurityConfig;
import org.springframework.security.web.FilterInvocation;
import org.springframework.security.web.access.intercept.FilterInvocationSecurityMetadataSource;
import java.util.*;
/**
 * Created by dingshuo on 2017/6/28.
 */
public class MyInvocationSecurityMetadataSource implements FilterInvocationSecurityMetadataSource {
	private static Map<String, Collection<ConfigAttribute>> resourceMap = null;
	@Autowired
	  UrlMatcher urlMatcher;
	public MyInvocationSecurityMetadataSource() {
		//這里可以查數(shù)據(jù)庫實現(xiàn)
		//注入dao即可
		resourceMap = new HashMap<String, Collection<ConfigAttribute>>();
		Collection<ConfigAttribute> atts = new ArrayList<ConfigAttribute>();
		ConfigAttribute ca = new SecurityConfig("ROLE_USER1");
		atts.add(ca);
		resourceMap.put("/index.jsp", atts);
		Collection<ConfigAttribute> attsno =new ArrayList<ConfigAttribute>();
		ConfigAttribute cano = new SecurityConfig("ROLE_NO");
		attsno.add(cano);
		resourceMap.put("/other.jsp", attsno);
	}
	@Override
	  public Collection<ConfigAttribute> getAttributes(Object object) throws IllegalArgumentException {
		String url = ((FilterInvocation)object).getRequestUrl();
		Iterator<String> ite = resourceMap.keySet().iterator();
		while (ite.hasNext()) {
			String resURL = ite.next();
			if (url.equals("/protected")) {
				return resourceMap.get(resURL);
			}
		}
		return null;
	}
	@Override
	  public Collection<ConfigAttribute> getAllConfigAttributes() {
		return null;
	}
	@Override
	  public Boolean supports(Class<?> clazz) {
		return true;
	}
}

實現(xiàn)JwtUrlSecurityInterceptor

package org.zerhusen.security.dsuri;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.security.access.AccessDecisionManager;
import org.springframework.security.access.SecurityMetadataSource;
import org.springframework.security.access.intercept.AbstractSecurityInterceptor;
import org.springframework.security.access.intercept.InterceptorStatusToken;
import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.web.FilterInvocation;
import javax.servlet.*;
import java.io.IOException;
/**
 * Created by dingshuo on 2017/6/28.
 */
public class JwtUrlSecurityInterceptor extends AbstractSecurityInterceptor implements
    Filter {
	@Autowired
	  public void setMyAccessDecisionManager(){
		super.setAccessDecisionManager(myAccessDecisionManagerBean());
	}
	@Bean
	  public MyAccessDecisionManager myAccessDecisionManagerBean(){
		return new MyAccessDecisionManager();
	}
	@Bean
	  public MyInvocationSecurityMetadataSource myInvocationSecurityMetadataSourceBean(){
		return new MyInvocationSecurityMetadataSource();
	}
	@Override
	  public void init(FilterConfig filterConfig) throws ServletException {
	}
	@Override
	  public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
		FilterInvocation fi = new FilterInvocation(request, response, chain);
		invoke(fi);
	}
	@Override
	  public void destroy() {
	}
	@Override
	  public Class<?> getSecureObjectClass() {
		return FilterInvocation.class;
	}
	@Override
	  public SecurityMetadataSource obtainSecurityMetadataSource() {
		return this.myInvocationSecurityMetadataSourceBean();
	}
	public void invoke(FilterInvocation fi) throws IOException, ServletException {
		InterceptorStatusToken token = super.beforeInvocation(fi);
		try {
			fi.getChain().doFilter(fi.getRequest(), fi.getResponse());
		}
		finally {
			super.afterInvocation(token, null);
		}
	}
}

如上是簡單的URL權(quán)限控制

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • SpringMVC 單文件,多文件上傳實現(xiàn)詳解

    SpringMVC 單文件,多文件上傳實現(xiàn)詳解

    這篇文章主要介紹了SpringMVC 單文件,多文件上傳實現(xiàn)詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-09-09
  • 淺談Java虛擬機(jī)對內(nèi)部鎖的四種優(yōu)化方式

    淺談Java虛擬機(jī)對內(nèi)部鎖的四種優(yōu)化方式

    這篇文章主要介紹了淺談Java虛擬機(jī)對內(nèi)部鎖的四種優(yōu)化方式,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-10-10
  • Java常用集合與原理解析

    Java常用集合與原理解析

    這篇文章主要介紹了Java常用集合與原理解析,本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-03-03
  • 基于Spring中的事務(wù)@Transactional細(xì)節(jié)與易錯點、幻讀

    基于Spring中的事務(wù)@Transactional細(xì)節(jié)與易錯點、幻讀

    這篇文章主要介紹了基于Spring中的事務(wù)@Transactional細(xì)節(jié)與易錯點、幻讀,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • Java中生成唯一ID的方法示例

    Java中生成唯一ID的方法示例

    這篇文章主要介紹了Java中生成唯一ID的方法示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-02-02
  • JVM鉤子函數(shù)的使用場景詳解

    JVM鉤子函數(shù)的使用場景詳解

    當(dāng)jvm進(jìn)程退出的時候,或者受到了系統(tǒng)的中斷信號,hook線程就會啟動,一個線程可以注入多個鉤,下面這篇文章主要給大家介紹了關(guān)于JVM鉤子函數(shù)使用的相關(guān)資料,需要的朋友可以參考下
    2021-08-08
  • java中String,數(shù)組,ArrayList三者之間的轉(zhuǎn)換

    java中String,數(shù)組,ArrayList三者之間的轉(zhuǎn)換

    這篇文章主要介紹了java中String,數(shù)組,ArrayList三者之間的轉(zhuǎn)換,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-01-01
  • 詳解Java設(shè)計模式編程中的訪問者模式

    詳解Java設(shè)計模式編程中的訪問者模式

    這篇文章主要介紹了Java設(shè)計模式編程中的訪問者模式,訪問者模式的合理利用可以避免項目中出現(xiàn)大量重復(fù)的代碼,需要的朋友可以參考下
    2016-02-02
  • 使用Java實現(xiàn)生命游戲串行代碼示例

    使用Java實現(xiàn)生命游戲串行代碼示例

    生命游戲是一種二維細(xì)胞自動機(jī),由英國數(shù)學(xué)家在1970年發(fā)明,在游戲的過程中,細(xì)胞會形成各種有規(guī)律的結(jié)構(gòu),展現(xiàn)出生命的復(fù)雜性和多樣性,本文通過java和JavaFX實現(xiàn)了一個簡單的生命游戲,可以直觀的觀察到細(xì)胞的迭代過程,需要的朋友可以參考下
    2024-10-10
  • MyBatisPlus使用@TableField注解處理默認(rèn)填充時間的問題

    MyBatisPlus使用@TableField注解處理默認(rèn)填充時間的問題

    這篇文章主要介紹了MyBatisPlus使用@TableField注解處理默認(rèn)填充時間的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-01-01

最新評論

共和县| 鹿泉市| 扶绥县| 饶河县| 曲松县| 闻喜县| 兴国县| 稻城县| 民和| 永吉县| 咸阳市| 哈尔滨市| 漳平市| 淮阳县| 桂平市| 鹿邑县| 通化县| 临江市| 江永县| 新丰县| 宁化县| 正镶白旗| 石嘴山市| 永泰县| 娄烦县| 平邑县| 封丘县| 本溪市| 西平县| 勐海县| 洪江市| 高阳县| 独山县| 夏邑县| 河西区| 海城市| 湖州市| 锡林浩特市| 太保市| 固镇县| 安阳县|