是的,定义多个拦截 URL 模式然后在顶部添加注释以进一步限制特定资源是很常见的。
您还可以为每个限制使用一个目录,这样您就不需要注释了。前任。 /user/** 需要 ROLE_USER,/admin/** 需要 ROLE_ADMIN 等。
在使用任何一种方法时请记住,如果您犯了错误,它会如何影响您的安全。
如果使用拦截url,则必须将行按正确的顺序排列,例如:
<intercept-url pattern="/**" access="permitAll"/>
<intercept-url pattern="/user/**" access="hasRole('ROLE_USER')"/>
将无法正常工作,因为您在第一行屏蔽了所有访问权限,因此必须颠倒这些行。如果初学者正在处理您的项目并反转线条,这可能是一个大问题。
如果你使用注解,可能会误删注解行,给你的应用留下一个安全漏洞。
@PreAuthorize("hasRole('ROLE_USER')")
如果您在两个项目之间重用一个控制器类,并且在一个项目中您希望允许 ROLE_USER 访问控制器内的所有方法,而另一个使用公共代码的项目需要 ROLE_ADMIN,那么实现这一点的最简单方法是使用拦截网址。
所以请记住,@PreAuthorize 将被硬编码并在项目之间共享。您可以扩展类并为每个项目添加不同的@PreAuthorize,但这会增加额外的复杂性。
我喜欢使用intercept-url 来保护整个区域,例如/user/**,因为误删注释的风险较小。
如果我需要添加细粒度访问,我会在控制器中的方法中添加一个注解,该注解已经被intercept-url 保护,但这种情况很少发生。