我理解@Secured会做什么,但不确定它是如何做到的。
有人可以解释@Secured如何抓住这些角色?它是从authorities-by-username-query
获得的吗?我可以在params中放入任何字符串,只要它在数据库中吗?
答案 0 :(得分:1)
用户的角色存储在SecurityContext
中,或者更具体地存储在Authentication
中存储的SecurityContext
对象中。进行身份验证时,将加载身份验证信息并将其存储在安全上下文中。角色可以源自数据库,具体取决于您的配置。在您的情况下,使用authorities-by-username-query
查询加载它们。
当安全拦截器处理授权时(例如使用@Secured
注释的方法级授权),它确定用户是否应该能够根据存储在上下文中的身份验证来访问它。
为了更好地了解幕后发生的事情,您应该查看参考指南的 Spring安全过滤器链和Architecture section。
答案 1 :(得分:1)
SpringSecurity提供了令人敬畏的AOP方法来保护方法 使用@Secured的Java应用程序。 Spring逻辑OR角色 列在@Secured注释中。 GrantedAuthorities的集合是从
获得的SecurityContextHolder.getContext().getAuthentication().getAuthorities()
AbstractSecurityInterceptor是实现的抽象类 安全对象的安全拦截。
从SecurityContextHolder获取Authentication对象。
对于受保护的调用(有一个列表 ConfigAttributes用于安全对象调用):
请查看source code以获得更多理解。
AccessDecisionManager是作为AffirmativeBased,ConsensusBased或UnanimousBased实现的接口,协调选民并依次询问每个请求用户是否应该通过@Secured注释或被拒绝。