Spring Security中openid的局限性

Spring Security中openid模块缺乏注册新用户的功能。例如,当一个用户访问我的网站,而我发现他没有登录。于是我就把他转到某个openid provider的页面去(例如yahoo)。当它登录完成并跳转回来后,因为在我本地数据库的user表中并没有找到与该openid相对应的记录,于是认证还是失败了。

一个想法是如果在本地的user表中没有找到。那么提供一个注册页面。让用户提交openid,以及其它的基本信息(但是不包括密码),然后把它加到数据库中去。但是这样应该是用户在使用openid登录成功后才能访问的。但是spring security的openid模块并没有给我提供一个这样的中间状态。

论坛上有人给出了解决办法,就是在web.xml中加一个listener:

<listener>
  <listener-class>org.springframework.security.ui.session.HttpSessionEventPublisher</listener-class>
</listener>

该类实现ApplicationListener接口,然后在onApplicationEvent中写:

if (event instanceof AuthenticationSuccessEvent) {
// Logon event
UsernamePasswordAuthenticationToken token = (UsernamePasswordAuthenticationToken) event.getSource();
WebAuthenticationDetails details = (WebAuthenticationDetails) token.getDetails();
String login = (String) token.getCredentials();

///TODO
addToDataBase(login,  details.getRemoteAddress(), details.getSessionId());
}

另外,我是不是应该限制下,只允许使用我所知的几个比较大的provider呢?如果允许用户任意输入网址,那么它就能牵引我去访问任意一台服务器。我觉得这样很危险。

此博客中的热门博文

少写代码,多读别人写的代码

在windows下使用llvm+clang

tensorflow distributed runtime初窥