首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何创建在spring安全表达式语言批注中使用的自定义方法

如何创建在spring安全表达式语言批注中使用的自定义方法
EN

Stack Overflow用户
提问于 2011-07-09 13:33:41
回答 2查看 66.8K关注 0票数 96

我想创建一个类来添加自定义方法,以便在spring安全表达式语言中通过注释进行基于方法的授权。

例如,我想创建一个像'customMethodReturningBoolean‘这样的自定义方法,以便以某种方式使用:

代码语言:javascript
复制
  @PreAuthorize("customMethodReturningBoolean()")
  public void myMethodToSecure() { 
    // whatever
  }

我的问题是。如果可能,我应该创建哪个类的子类来创建我的自定义方法,我应该如何在spring xml配置文件中配置它,并有人给我一个以这种方式使用的自定义方法的示例?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-07-09 19:25:00

您需要创建两个类的子类。

首先,设置一个新的方法表达式处理程序

代码语言:javascript
复制
<global-method-security>
  <expression-handler ref="myMethodSecurityExpressionHandler"/>
</global-method-security>

myMethodSecurityExpressionHandler将是覆盖createEvaluationContext()DefaultMethodSecurityExpressionHandler的子类,在MethodSecurityEvaluationContext上设置MethodSecurityExpressionRoot的子类。

例如:

代码语言:javascript
复制
@Override
public EvaluationContext createEvaluationContext(Authentication auth, MethodInvocation mi) {
    MethodSecurityEvaluationContext ctx = new MethodSecurityEvaluationContext(auth, mi, parameterNameDiscoverer);
    MethodSecurityExpressionRoot root = new MyMethodSecurityExpressionRoot(auth);
    root.setTrustResolver(trustResolver);
    root.setPermissionEvaluator(permissionEvaluator);
    root.setRoleHierarchy(roleHierarchy);
    ctx.setRootObject(root);

    return ctx;
}
票数 35
EN

Stack Overflow用户

发布于 2013-02-16 06:05:34

上面提到的这些技术都不再有效。看起来Spring似乎已经花了很长时间来阻止用户覆盖SecurityExpressionRoot。

编辑14年11月19日Setup Spring以使用安全注释:

代码语言:javascript
复制
<beans ... xmlns:sec="http://www.springframework.org/schema/security" ... >
...
<sec:global-method-security pre-post-annotations="enabled" />

创建一个bean,如下所示:

代码语言:javascript
复制
@Component("mySecurityService")
public class MySecurityService {
    public boolean hasPermission(String key) {
        return true;
    }
}

然后在您的jsp中执行如下操作:

代码语言:javascript
复制
<sec:authorize access="@mySecurityService.hasPermission('special')">
    <input type="button" value="Special Button" />
</sec:authorize>

或者注释一个方法:

代码语言:javascript
复制
@PreAuthorize("@mySecurityService.hasPermission('special')")
public void doSpecialStuff() { ... }

此外,您可以在@PreAuthorize注释中使用Spring Expression Language来访问当前的身份验证和方法参数。

例如:

代码语言:javascript
复制
@Component("mySecurityService")
public class MySecurityService {
    public boolean hasPermission(Authentication authentication, String foo) { ... }
}

然后更新您的@PreAuthorize以匹配新的方法签名:

代码语言:javascript
复制
@PreAuthorize("@mySecurityService.hasPermission(authentication, #foo)")
public void doSpecialStuff(String foo) { ... }
票数 186
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6632982

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档