我需要使旧版应用程序开始使用Spring Security 3。
该应用程序已经具有以下安全数据模型:
到目前为止非常简单。我可以编写自定义的usersByUsernameQuery
和authoritiesByUsernameQuery
。
事实是,还有另一个表指示角色可以执行的操作(即@Service
层方法):
因此,管理员可以启用/禁用角色通过Web界面访问操作,而无需重新部署应用程序。
例如,我仍然可以用@Secure('ROLE_ADMIN')
注释业务方法,但是我的自定义UserDetailsService
必须至少知道受保护的方法名称,这样我才能执行正确的查询。
因此,问题是:我的自定义UserDetailsService
是否可以拦截被保护的方法名称?
最佳答案
听起来您的访问决策基于“操作角色”,而不是用户角色,因此最好在Spring Security约束中直接使用“操作角色”。从本质上讲,这是一种RBAC方法,其中用户角色与允许他们执行的操作之间存在映射。
您可以在AuthenticationProvider
而不是UserDetailsService
中解决此问题,方法是在其中添加一个映射层,该映射层将用户角色(由UserDetailsService
提供)转换为用户在应用程序中拥有的权限。这些将构成由Authentication
创建的AuthenticationProvider
对象中返回的权限的集合。
映射层将直接使用管理界面提供的数据。
您可能想看看Mike Weisner撰写的this presentation,其中涵盖了类似的内容。
此外,Spring Security 3.1还将包括一个附加的GrantedAuthorityMapper
策略,以使其更容易插入此类映射。