用谷歌和春季mvc登录开放ID

时间:2015-07-18 18:55:12

标签: login openid

我正在尝试使用open id和google登录开发一个spring mvc项目。 我正在使用java配置。而xml配置是

 <openid-login user-service-ref="openIdUserService" >
  <attribute-exchange >
<openid-attribute name="email" type="http://schema.openid.net/contact/email"    required="true" />
  <openid-attribute name="firstName" type="http://axschema.org/namePerson/first" required="true" />
  <openid-attribute name="lastName" type="http://axschema.org/namePerson/last" required="true" />
</attribute-exchange>

但无法弄清楚java配置中的相应代码是什么。

任何建议和一些代码示例。

我也使用弹簧安全。

以下是提供者:

public class OpenIdUserDetailsService implements UserDetailsService, AuthenticationUserDetailsService {

    @Autowired
    private CustomerRepository userRepository;
    private static final List DEFAULT_AUTHORITIES = AuthorityUtils.createAuthorityList("ROLE_USER");

    @Override
    public UserDetails loadUserByUsername(String id) throws UsernameNotFoundException {
        Customer user = userRepository.findByOpenIdIdentifier(id);

        if (user == null) {
            throw new UsernameNotFoundException(id);
        }
        OpenIdUser openIdUser = new OpenIdUser(user.getOpenIdIdentifier(), DEFAULT_AUTHORITIES);
        openIdUser.setName(user.getFirstname());

        return openIdUser;
    }

    @Override
    public UserDetails loadUserDetails(OpenIDAuthenticationToken token) {
        String id = token.getIdentityUrl();

        Customer user = userRepository.findByOpenIdIdentifier(id);

        if (user != null) {
            OpenIdUser openIdUser = new OpenIdUser(user.getOpenIdIdentifier(), DEFAULT_AUTHORITIES);
            openIdUser.setName(user.getFirstname());

            return openIdUser;
        }

        String firstName = null;
        String lastName = null;
        String fullName = null;

        List attributes = token.getAttributes();

        for (OpenIDAttribute attribute : attributes) {
            String name = attribute.getName();

            if (name.equals("firstname")) {
                firstName = attribute.getValues().get(0);
            } else if (name.equals("lastname")) {
                lastName = attribute.getValues().get(0);
            } else if (name.equals("fullname")) {
                fullName = attribute.getValues().get(0);
            }
        }

        if (fullName == null) {
            StringBuilder fullNameBldr = new StringBuilder();

            if (firstName != null) {
                fullNameBldr.append(firstName);
            }
            if (lastName != null) {
                fullNameBldr.append(" ").append(lastName);
            }

            fullName = fullNameBldr.toString();
        }

        OpenIdUser openIdUser = new OpenIdUser(id, DEFAULT_AUTHORITIES);
        openIdUser.setName(fullName);
        openIdUser.setNewUser(true);

        Customer u = new Customer();
        u.setOpenIdIdentifier(openIdUser.getUsername());
        u.setFirstname(openIdUser.getName());

        userRepository.save(u);

        return openIdUser;
    }
}

感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

OpenIDLoginConfigurer构建器将构建OpenIDAuthenticationFilter并在spring安全过滤器链中注册过滤器。

OpenIDLoginConfigurer使用attributeExchange参数构建OpenIDAuthenticationFilter。这些是使用openid提供程序进行身份验证后的回调参数。

要通过Spring安全性使用open id进行身份验证,请求的url将是&#34; / j_spring_openid_security_check&#34; OpenIDAuthenticationFilter将通过点击openid提供程序进行身份验证来处理此请求。一旦身份验证完成,openid用户将与本地用户进行映射。

Here是一个简单的示例应用程序,可以使用spring security安装openId。