我需要使旧版应用程序开始使用Spring Security 3。

该应用程序已经具有以下安全数据模型:



到目前为止非常简单。我可以编写自定义的usersByUsernameQueryauthoritiesByUsernameQuery

事实是,还有另一个表指示角色可以执行的操作(即@Service层方法):



因此,管理员可以启用/禁用角色通过Web界面访问操作,而无需重新部署应用程序。

例如,我仍然可以用@Secure('ROLE_ADMIN')注释业务方法,但是我的自定义UserDetailsService必须至少知道受保护的方法名称,这样我才能执行正确的查询。

因此,问题是:我的自定义UserDetailsService是否可以拦截被保护的方法名称?

最佳答案

听起来您的访问决策基于“操作角色”,而不是用户角色,因此最好在Spring Security约束中直接使用“操作角色”。从本质上讲,这是一种RBAC方法,其中用户角色与允许他们执行的操作之间存在映射。

您可以在AuthenticationProvider而不是UserDetailsService中解决此问题,方法是在其中添加一个映射层,该映射层将用户角色(由UserDetailsService提供)转换为用户在应用程序中拥有的权限。这些将构成由Authentication创建的AuthenticationProvider对象中返回的权限的集合。

映射层将直接使用管理界面提供的数据。

您可能想看看Mike Weisner撰写的this presentation,其中涵盖了类似的内容。

此外,Spring Security 3.1还将包括一个附加的GrantedAuthorityMapper策略,以使其更容易插入此类映射。

10-08 07:19
查看更多