在前一篇文章中,还是有些地方没讲清楚,但那篇文章已经有点长了,所以还是另外单独讲一下吧。见SecureResourceFilterInvocationDefinitionSource代码:
/**
* RegexUrlPathMatcher默认不进行小写转换,而AntUrlPathMatcher默认要进行小写转换
*/
public void afterPropertiesSet() throws Exception {
// default url matcher will be RegexUrlPathMatcher
this.urlMatcher = new RegexUrlPathMatcher();
if (useAntPath) { // change the implementation if required
this.urlMatcher = new AntUrlPathMatcher();
}
// Only change from the defaults if the attribute has been set
if ("true".equals(lowercaseComparisons)) {
if (!this.useAntPath) {
((RegexUrlPathMatcher) this.urlMatcher).setRequiresLowerCaseUrl(true);
}
} else if ("false".equals(lowercaseComparisons)) {
if (this.useAntPath) {
//是否对URL全部转换成小写格式
((AntUrlPathMatcher) this.urlMatcher).setRequiresLowerCaseUrl(false);
}
}
}
//这个方法主要会在FilterSecurityInterceptor->AbstractSecurityInterceptor->beforeInvocation中用到
public ConfigAttributeDefinition getAttributes(Object filter) throws IllegalArgumentException {
FilterInvocation filterInvocation = (FilterInvocation) filter;
String requestURI = filterInvocation.getRequestUrl();
Map<String, String> urlAuthorities = this.getUrlAuthorities(filterInvocation);
String grantedAuthorities = null;
for(Iterator<Map.Entry<String, String>> iter = urlAuthorities.entrySet().iterator(); iter.hasNext();) {
Map.Entry<String, String> entry = iter.next();
//url表示从资源表取出的值,在这里代表的是相应的URL
String url = entry.getKey();
//这段代码表示数据库内的需要验证的资源URL与当前请求的URL相匹配时进行验证
if(urlMatcher.pathMatchesUrl(url, requestURI)) {
//grantedAuthorities表示每个资源对应的角色,如果有多个角色,则以','隔开
grantedAuthorities = entry.getValue();
break;
}
}
if(grantedAuthorities != null) {
ConfigAttributeEditor configAttrEditor = new ConfigAttributeEditor();
configAttrEditor.setAsText(grantedAuthorities);
return (ConfigAttributeDefinition) configAttrEditor.getValue();
}
//返回null表示不会验证
return null;
}
这个方法的主要作用是从数据库的resource表加载出所有的资源URL值,通过它与request请求的URL相比较,而比较器一般采用AntUrlPathMatcher,如果需要更加灵活的方式,可以使用RegexUrlPathMatcher,先介绍一下上面的getAttributes是怎么通过URL进行验证的。从上面的for循环可以看出,首先遍历资源URL的列表,如果发现有与当前request请求URL相匹配的,就进行验证,如果当前用户拥有的角色与此资源URL对应的角色相同,则通过验证,否则禁止访问。见下图:
上面一张简单的图,基本能说明意思,需要说明的是只要发现有与当前请求路径相匹配的,就会进行验证,而且只验证一次,没有通过验证也不会再检查是否匹配第二个资源URL,的当然如果请求的URL与第一个资源URL不匹配,就会继续向下查找,直到找到与请求URL匹配的资源URL为止,如果遍历完以后,还是没有查到,就到弃权处理,至于所有投票者都弃权以后,该怎么处理,前一篇博客有介绍的。由此可知,这个资源的URL路径的顺序就比较重要了。如果遍历出来的第一个资源URL为/**,而普通用户角色对应的资源URL没有它,那么即使普通角色拥有其它的资源URL权限也是不能访问到相应的页面的。但是如果普通用户有/**的权限,而/**是匹配所有路径的,如/admin/index.jsp也是会匹配的,这样就相当于普通用户拥有任何路径的权限,这也是不行的。所以遍历出来的资源URL顺序很重要。
在基于XML的方式授权时就是把/**放在最后面的,如:
<intercept-url pattern="/secure/extreme/**" access="ROLE_SUPERVISOR"/>
<intercept-url pattern="/secure/**" access="IS_AUTHENTICATED_REMEMBERED" />
<intercept-url pattern="/**" access="IS_AUTHENTICATED_ANONYMOUSLY" />
也就是说,这个路径放的顺序很重要,在数据库里存放URL时也要遵循这样的规则,如上面的XML放在数据库里应该这样:
这里需要多做的一个步骤是,取出来后不要改变取数据库记录的顺序。在SecurityManagerSupport中的代码:
public Map<String, String> loadUrlAuthorities() {
Map<String, String> urlAuthorities = new LinkedHashMap<String, String>();
@SuppressWarnings("unchecked")
List<Resource> urlResources = getHibernateTemplate().find("FROM Resource resource WHERE resource.type = ?", "URL");
for(Resource resource : urlResources) {
urlAuthorities.put(resource.getValue(), resource.getRoleAuthorities());
}
return urlAuthorities;
}
要保持取出的数据的顺序不改变,需要使用LinkedHashMap,这样SecureResourceFilterInvocationDefinitionSource在验证URL的顺序就与数据库里面存的顺序一致了,表面上看的确有些不灵活,而实际上,在使用中时资源URL是固定的,用户不能改变的,所以这也没什么影响。
关于AntUrlPathMatcher的匹配规则也很简单,文档中有说明:
* <li>? matches one character</li>
* <li>* matches zero or more characters</li>
* <li>** matches zero or more 'directories' in a path</li>
- 大小: 21.4 KB
- 大小: 9.7 KB
分享到:
相关推荐
3. **授权配置**:Spring Security提供了一种基于角色的访问控制(RBAC),可以通过 `@PreAuthorize` 和 `@Secured` 注解实现方法级别的访问控制,或配置 `http.authorizeRequests()` 来设置URL路径的访问权限。...
Spring Security允许我们定义哪些URL路径需要用户进行身份验证才能访问。这通常通过在`web.xml`中配置`<http>`元素来实现。例如: ```xml <intercept-url pattern="/admin/**" access="ROLE_ADMIN" /> ...
- 配置忽略资源:在Spring Security配置中,可以指定哪些URL路径应该被忽略,不进行安全控制。例如,`httpBasic().and().ignoring().antMatchers("/resources/**")` 将忽略所有以"/resources/"开头的URL。 - 使用`...
标题中提到的"Spring集成SpringSecurity依赖包"应该包含了这些必要的依赖,包括Spring Security本身和可能的Spring MVC依赖。 2. **配置Spring Security**:创建一个配置类,继承自`WebSecurityConfigurerAdapter`...
Spring Security 是一个强大的且高度可定制的身份验证和访问控制框架,用于Java应用程序。在Spring Boot中集成Spring Security,可以轻松地实现安全控制,包括用户身份验证、授权和会话管理。本示例将探讨如何使用...
以下是一些关于SpringSecurity处理静态资源的关键知识点: 1. **静态资源路径配置**:在Spring Security配置类中,可以通过`WebSecurityConfigurerAdapter`的子类来配置静态资源的访问权限。例如,可以使用`...
在Spring Security配置类中,你需要重写`configure(HttpSecurity http)`方法,定义哪些URL需要保护以及如何进行身份验证。例如: ```java @Override protected void configure(HttpSecurity http) throws ...
Spring Security是一个强大且高度可定制的身份验证和访问控制框架,用于Java和Java EE应用。它为应用程序提供了全面的安全解决方案,包括用户认证、授权以及安全配置。本实例主要面向初学者,通过一个基于Maven的...
Spring Security 通过提供一套强大而灵活的安全机制,极大地简化了开发过程中关于身份验证和授权的处理。通过学习 Spring Security 的基本概念和工作原理,开发者可以更好地理解如何利用 Spring Security 保护自己的...
- 提交表单时,URL应指向SpringSecurity的默认登录处理路径,通常是/login。 3. 自定义登录逻辑: - 实现AuthenticationProvider接口,重写其authenticate()方法,这里可以连接数据库进行用户名和密码的匹配。 -...
在案例中,你可以看到如何配置SpringSecurity来处理用户的登录、注销,以及对不同URL路径的访问控制。它通过定义安全配置,如`httpSecurity`,来设定哪些请求需要用户认证,哪些请求需要特定的角色权限。 1. **用户...
在配置中,你可以定义哪些URL路径需要授权,以及哪些角色可以访问这些路径。例如,`@Secured` 或 `@PreAuthorize` 注解可以用来控制方法级别的访问权限。 3. **过滤器链(Filter Chain)**:Spring Security 的核心...
描述中提到的spring-security-3.1.0.RELEASE.zip文件是SpringSecurity 3.1版本的库,包含所有必要的JAR文件,这些文件将被添加到项目类路径中,使得我们可以使用SpringSecurity提供的API和功能。在3.1版本中,Spring...
在"springSecurity demo 下载可用"的描述中,我们可以推测这是一个示例项目,用于展示如何在SSM(Spring、SpringMVC、MyBatis)框架下整合Spring Security。 SSM框架是Java Web开发中常用的组合,其中Spring负责...
使用`@Secured`或`@PreAuthorize`等注解可以实现方法级别的权限控制,而`<intercept-url>`元素则用于配置URL路径的访问规则。 3. **过滤器链**:Spring Security 的工作流程主要通过一系列过滤器完成,如`...
Spring Security 是一个强大的且高度可定制的 Java 安全框架,用于解决 Web 应用程序的安全问题。这个框架提供了一套全面的解决方案,包括身份验证、授权、会话管理以及跨站请求伪造(CSRF)防护等核心功能。在本文...
2. **配置跳转权限**:此方法定义了不同的URL路径所需的访问权限。 ```java @Override protected void configure(HttpSecurity http) throws Exception { http.authorizeRequests() .antMatchers("/hello/**")....
Spring Security拥有庞大的社区,开发者可以在论坛、Stack Overflow等平台上找到很多关于3.2.5版本的问题解答和实践经验。 总的来说,Spring Security 3.2.5为开发人员提供了强大的安全基础,无论是在企业级应用...
4.0.1版本中,过滤器链可以更精细地定制,允许开发者根据URL路径、HTTP方法或其他条件决定哪些过滤器应该被应用。这使得在大型项目中,可以根据不同部分的需求来调整安全策略。 在Web安全方面,Spring Security提供...
Spring Security 是一个强大的、高度可定制的访问控制和身份验证框架,主要用于Java应用程序,特别是基于Spring的应用程序。这个"spring-security-3.1.3.RELEASE-dist.zip"压缩包包含了Spring Security 3.1.3版本的...