我有以下用例,需要有关正确实施的建议。要明确这可以通过配置完成,还是需要实现新代码?
商业用例
企业希望允许用户通过社交媒体网站登录并访问他们的某些网页。但是,为了访问处理$$的页面,用户必须通过应用程序本地帐户登录。
技术用例
允许用户通过Facebook或其他提供商登录并提供角色USER_PARTIAL_RIGHTS
如果用户访问具有角色USER_FULL_RIGHTS的页面,则提示用户登录到本地JDBC存储帐户的帐户。
此身份验证还必须确保页面受USER_FULL_RIGHTS角色的保护,而不是其他角色。
我正在使用grail spring安全插件,但我希望必须自定义插件。
那么这样做的建议是什么?我有几个想法:
技术创意
答案 0 :(得分:0)
根据我对你的问题的理解,这是我的建议。 要通过Facebook登录,请使用Spring Social。 Here是文档。实现很简单。编写自定义登录方法并设置部分权限的权限,如下所示:
public void signin(String userId) {
authorities = new ArrayList<GrantedAuthority>();
//set your partial rights authority
SecurityContextHolder.getContext().setAuthentication(new UsernamePasswordAuthenticationToken(userId, null, authorities));
}
使用@secured注释执行方法级安全性实现,以访问需要完全权限的页面。像这样的东西
@Secured("USER_FULL_RIGHTS ")
yourMethod(){
//code
}
这将提示登录,其中可以使用来自应用程序本地帐户的身份验证。
答案 1 :(得分:0)
我们最终实现的是一个控制器,它会查看角色并将用户重定向到正确的登录页面。有点凌乱,但它确实有效。
Collection<GrantedAuthority> inferred = SpringSecurityUtils.findInferredAuthorities(SpringSecurityUtils.getPrincipalAuthorities());
if(ifAnyGranted('ROLE_FOO', inferred)) {
redirect(controller: 'foo',action: 'home')
return
}