我为我的Web应用程序完全配置了SPRING METHOD安全性。 (启用PRE / POST注释)。
但是最近我遇到了一个奇怪的问题。总结如下:
POJOS摘要
// User Class
public class User {
int id;
String name;
// getters and setters
}
// Group Class
public class Group {
int id;
String name;
// getters and setters
}
// GroupMembership class
public class GroupMembership {
private int id;
private User user;
private Group group;
// getters and setters
}
PreAuthorise过滤方法。
@PreAuthorize("canIEditGroupProfile(#membership.group.id)")
public int updateGroupMembership(GroupMembership membership)
throws GroupsServiceException;
传递完全填充的GroupMembership
对象(存在正确的用户和组合成)后,安全过滤器将抛出以下异常:
errorMessage: "Failed to evaluate expression
canIEditGroupProfile(#membership.group.id)'"
在深入了解异常时:
原因是:
org.springframework.expression.spel.SpelEvaluationException:
EL1007E:(pos 33): Field or property 'group' cannot be found on null
请提供相同的指示。
答案 0 :(得分:4)
getter / setters看起来很好......也没有null
的情况。
然而一个有趣的观察;这个给了我一个错误:
@PreAuthorize("canIEditGroupProfile(#membership.group.id)")
public int updateGroupMembership(GroupMembership membership)
throws GroupsServiceException;
这很好用:
@PreAuthorize("canIEditGroupProfile(#groupmembership.group.id)")
public int updateGroupMembership(GroupMembership groupmembership)
throws GroupsServiceException;
我进一步观察到,第一个参数名称不匹配(即Service和ServiceImpl都有不同的参数名称)。
现在保持一致性,这个问题似乎已经解决了。
答案 1 :(得分:1)
我在Spring Boot应用程序中遇到了同样的问题。事实证明,我正在编译时没有我的调试符号信息,正如上面的评论中提到的那样。我想说的是我可以通过两种方式解决问题:
1.(我最喜欢的一个): 只需将其包含在您的pom.xml中 - >插件
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<compilerArgument>-parameters</compilerArgument>
<testCompilerArgument>-parameters</testCompilerArgument>
</configuration>
</plugin>
我发现真的很有意思this link来了解这个问题。
希望它有所帮助!
答案 2 :(得分:0)
正如@zeroflagL问:你在没有调试信息的情况下进行编译吗?这可能与spring @Cacheable with Ehcache, spel find null for valid object和Spring @Cacheable with SpEL key: always evaluates to null相同 - 检查您的POM(或Eclipse配置或其他)以获取调试配置,例如<debug>false</debug>
中的maven-compiler-plugin
。 / p>
答案 3 :(得分:0)
我遇到了同样的问题,发现接口和实现中用于检查授权的对象的名称必须相同。
例如,如果您的界面中有此方法:
@PreAuthorize("hasPermission(#foo, 'UPDATE')")
public void testMethod(MyObject foo);
您应在实现中添加以下内容:
public void testMethod(MyObject foo) { ... your code here... }
我希望这会有所帮助。