Spring @PreAuthorize hasAuthority 异常 无法将值 'hasAuthority 从类型 [java.lang.String] 转换为类型 [java.lang.Boo



所以我创建了一个带有两个简单公共字符串的类

public final class Right {
private Right() {
super();
}
public static final String AUTH = "hasAuthority('admin') or hasAuthority('mod')";
}

当我在控制器上将它与@PreAuthorize注释一起使用时,它就像一个符咒。我不喜欢它是硬编码的。出于这个原因,我把角色放在了属性中,并尝试将其用作一个组件:

@Component("authRule")
public class AuthRule {
@Value("${role.administrator}")
private String roleAdmin;
@Value("${role.moderator}")
private String roleMod;
public String getRightAccess() {
return "hasAuthority('" + roleAdmin+ "')" + " or hasAuthority('" + roleMod+ "')";
}
}

当我在预授权中使用它时:

@PreAuthorize("@authRule.getRightAccess()")

对于值"hasAuthority"("admin"(或hasAuthority("mod"(,我返回了从类型[java.lang.String]转换为类型[java.lang.Boolean]失败的异常

如果我在预授权中硬编码。我对此很困惑。有什么想法吗?

提前感谢所有回复。

我已经快速阅读了文档;https://docs.spring.io/spring-security/site/docs/current/reference/html5/#el-前-后注释

提供给注释的值很可能只解析一次。我认为你需要它解析两次;一次以触发自定义组件的方法getRightAccess((。第二次解析该方法返回的String结果。这里有一些例子,如果你对";布尔";;https://docs.spring.io/spring/docs/4.3.10.RELEASE/spring-framework-reference/html/expressions.html

// evaluates to true
boolean isMember = parser.parseExpression("isMember('Mihajlo Pupin')").getValue(
societyContext, Boolean.class);

因此,您可能需要在getRightAccess((方法中使用类似的内容;

return parser.parseExpression("hasAuthority('"+roleAdmin+"') or hasAuthority('"+roleMod+"')").getValue(Boolean.class);

相关内容

  • 没有找到相关文章

最新更新