Java @预授权不适用于方法安全规则和方法参数

Java @预授权不适用于方法安全规则和方法参数,java,spring-security,annotations,aspectj,Java,Spring Security,Annotations,Aspectj,我正在将Spring安全性添加到一个Spring项目中。 系统的体系结构是REST,用户可以访问不同的资源 我希望将访问个人信息的权限授予作为此信息所有者的管理员和用户。 我已经开始简单地筛选用户配置文件,如下所示: 在我的服务层中我想使用方法注释并包含方法参数 @PreAuthorize("hasRole('ROLE_ADMIN') or principal.userId == #id") public Usuario getUser(int id) throws DAOException {

我正在将Spring安全性添加到一个Spring项目中。 系统的体系结构是REST,用户可以访问不同的资源

我希望将访问个人信息的权限授予作为此信息所有者的管理员和用户。 我已经开始简单地筛选用户配置文件,如下所示:

在我的服务层中我想使用方法注释并包含方法参数

@PreAuthorize("hasRole('ROLE_ADMIN') or principal.userId == #id")
public Usuario getUser(int id) throws DAOException {
    ...
}
但这根本不起作用。请求此URL时,任何用户都可以查看所有配置文件(管理员和所有用户)(Web层):

这是我的
security.xml


很明显,我的配置和书中所说的一样。我读过其他堆栈溢出帖子(和),但我没有运气

更新:添加了
应用程序上下文.xml


更新:我在POM中添加了
spring安全特性
,没有任何更改。答案中建议的其他更改已经过测试,但是
@PreAuthorize
等注释仍然不起作用。Cna这可能是上下文之间的问题吗?aspectJ的使用可能是原因吗

我做错了什么?

添加新界面:

public interface UserService extends UserDetailsService {
    Usuario getUser(int id) throws DAOException
}
在用户服务中实现它,然后重试。Spring将能够使用JDK代理添加请求的授权检查

作为另一个选项,您可以将Spring配置为使用一些更重的库,比如Javassist,甚至AspectJ。在这种情况下,接口将是不必要的

编辑。确保在与用户服务bean相同的spring上下文中声明了
全局方法安全性。

最终我找到了解决方案。 于是我找到了一些有用的答案。见和

我将
global method security
移动到
application context.xml
,这是我服务的上下文


其中
mode=“aspectj”
如Javadoc所述:

…可用于指定应使用AspectJ而不是 默认的Spring AOP。若设置了,则安全类必须与 来自spring安全特性模块的AnnotationSecurityAspect

当然,我已经在POM
spring安全方面添加了以下内容:


org.springframework.security
春季安全方面
3.1.3.1发布

另一种方法是在security.xml中添加以下代码

<intercept-url pattern="/user/**" access="hasRole('ROLE_ADMIN')" />


它将确保只有管理员才能访问以pattern/user/

开头的资源。您的
Usuario getUser(int-id)
方法是在某些界面中定义的吗?默认情况下,此类注释可能不起作用(JDK代理用于在运行时添加授权检查,它们只能针对接口方法)@Maksymdimidas No.我的UsuarioService实现UserDetails服务。我还在使用我自己的UsuarioDetails类,该类扩展了我的域Usuario并实现了UserDetailswft-man:)将“/*/*/*/*/*”更改为“/**”@Yura我不再维护此应用程序,但感谢您的建议!添加接口时不工作。。我是否应该像我在文章中那样对方法进行注释,而不是在接口中,不是吗?是的,注释通常应用于实现端请显示您的SpringXML。您可以有两个spring上下文(用于bean和springmvc)。您确定您的全局方法安全元素是在与您的用户服务相同的上下文中定义的吗?我添加了SpringXML。事实上,我不是在这里声明bean。的确,我有另一个上下文:SpringMVC。全局方法安全性在这里声明。也许我应该将全局注释移到SpringXML中。您可以在两种上下文中声明它,以确保您的注释在任何地方都能正常工作。很高兴看到您找到了解决方案!移动全局方法安全性解决了我的问题。
<intercept-url pattern="/user/**" access="hasRole('ROLE_ADMIN')" />