前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Springsecurity之jsp中url方式控制权限

Springsecurity之jsp中url方式控制权限

作者头像
克虏伯
发布2019-04-15 10:12:12
6270
发布2019-04-15 10:12:12
举报

    注:Springsecurity版本是4.2.4.RELEASE。

    在jsp中使用has('role')的方式可以看下我的这篇博客

1、引入maven依赖

List-1.1

代码语言:javascript
复制
<dependency>
    <groupId>org.springframework.security</groupId>
    <artifactId>spring-security-taglibs</artifactId>
    <version>4.2.4.RELEASE</version>
</dependency>

2、xml配置

List-2.1

代码语言:javascript
复制
<bean id="webInvocationFilter"
      class="org.springframework.security.web.access.DefaultWebInvocationPrivilegeEvaluator">
    <constructor-arg ref="filterSecurityInterceptor"/>
</bean>

<security:http entry-point-ref="xx" use-expressions="true">
   ...
</security:http>

    如List-2.1所示,单独定义个DefaultWebInvocationPrivilegeEvaluator的bean就可以了,将interceptor作为构造函数的参数传给它,Springsecurity会自动加载它,需要注意的是这个webInvocationFilter要放在security配置的最前面,不然会失效,至于为什么,现在还没弄清楚。

3、jsp中使用标签

List-3.1

代码语言:javascript
复制
...
<body>
...

<sec:authorize url="/someUrl">
    有权限的用户才能看到这段话。
</sec:authorize>
...
</body>
...

    我选择使用url的方式而非has('role')的方式,理由:角色名称、个数很有可能会经常变动,如果我们以has('role')的方式将role写到了jsp中,那么后面我们修改角色时,很有可能要去修改jsp中的角色;相反,如果以url的方式,那么我们只需要修改数据库中url、role、用户间的关系,不需要去关注是否要修改jsp中的权限。

4、源码分析

    如下图4.1所示,DefaultWebInvocationPrivilegeEvaluator的构造方法中需要AbstractSecurityInterceptor。

                                                                                            图4.1

    来看isAllowed方法,如下List-4.1所示:

List-4.1

代码语言:javascript
复制
public boolean isAllowed(String contextPath, String uri, String method,
		Authentication authentication) {
	Assert.notNull(uri, "uri parameter is required");
	FilterInvocation fi = new FilterInvocation(contextPath, uri, method);
	Collection<ConfigAttribute> attrs = securityInterceptor
			.obtainSecurityMetadataSource().getAttributes(fi);
	if (attrs == null) {
		if (securityInterceptor.isRejectPublicInvocations()) {
			return false;
		}
		return true;
	}
	if (authentication == null) {
		return false;
	}
	try {
		securityInterceptor.getAccessDecisionManager().decide(authentication, fi,
				attrs);
	}
	catch (AccessDeniedException unauthorized) {
		if (logger.isDebugEnabled()) {
			logger.debug(fi.toString() + " denied for " + authentication.toString(),
					unauthorized);
		}
		return false;
	}
	return true;
}
  1. 首先用securityInterceptor的SecurityMetadataSource获取当前request对应的所有ConfigAttribute,即访问当前request中的url需要哪些权限。
  2. 之后用securityInterceptor的AccessDecisionManager来决定当前用户是否可以访问request中的url。

Reference

  1. Springsecurity-4.2.4.RELEASE源码
代码语言:txt
复制
 (adsbygoogle = window.adsbygoogle || []).push({});
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018/12/26 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1、引入maven依赖
  • 2、xml配置
  • 3、jsp中使用标签
  • 4、源码分析
  • Reference
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档