Spring security 向Spring Security oAuth2登录添加自定义参数

Spring security 向Spring Security oAuth2登录添加自定义参数,spring-security,spring-security-oauth2,Spring Security,Spring Security Oauth2,我有一个用Java编写的webapp,使用Spring作为后端框架。我使用SpringSocialOAuth2通过facebook和google实现了登录。 我想知道是否有办法向登录请求传递额外的参数 @Service @Transactional(rollbackFor=Exception.class) public class CustomOAuth2UserService extends DefaultOAuth2UserService { @Autowired priv

我有一个用Java编写的webapp,使用Spring作为后端框架。我使用SpringSocialOAuth2通过facebook和google实现了登录。 我想知道是否有办法向登录请求传递额外的参数

@Service
@Transactional(rollbackFor=Exception.class)
public class CustomOAuth2UserService extends DefaultOAuth2UserService {

    @Autowired
    private UserService userService;

    @Autowired
    private AccountHolderService accountHolderService;


    @Override
    public OAuth2User loadUser(OAuth2UserRequest oAuth2UserRequest) throws OAuth2AuthenticationException {
        OAuth2User oAuth2User = super.loadUser(oAuth2UserRequest);

        try {
            return processOAuth2User(oAuth2UserRequest, oAuth2User);
        }catch (Exception | EmailAlreadyTakenException | UsernameNotAvailableException | PostTypeNotFoundException ex) {
            // Throwing an instance of AuthenticationException will trigger the OAuth2AuthenticationFailureHandler
            throw new InternalAuthenticationServiceException(ex.getMessage(), ex.getCause());
        }
    }

    private OAuth2User processOAuth2User(OAuth2UserRequest oAuth2UserRequest, OAuth2User oAuth2User) throws EmailAlreadyTakenException, UsernameNotAvailableException, PostTypeNotFoundException {
        OAuth2UserInfo oAuth2UserInfo = OAuth2UserInfoFactory.getOAuth2UserInfo(oAuth2UserRequest.getClientRegistration().getRegistrationId(), oAuth2User.getAttributes());
        if(StringUtils.isEmpty(oAuth2UserInfo.getEmail())) {
            throw new RuntimeException("Id not found from OAuth2 provider");
        }
        User user;
        try {
            user = userService.getBySocialId(oAuth2UserInfo.getId());
            return new CustomUserDetails(user);
        } catch (UserNotFoundException e) {
            try {
                User u = userService.getByEmail(oAuth2UserInfo.getEmail());
                throw new EmailAlreadyTakenException("email-already-taken");
            }catch (UserNotFoundException ex){
                // create user
                User u = userService.addUser(user);
                return new CustomUserDetails(u);
            }
        }
    }

    private User buildSocialProvidedUser(OAuth2UserRequest oAuth2UserRequest, OAuth2UserInfo oAuth2UserInfo) {
        ...
        return user;
    }

    private String generateUsername(String username){
        ...
    }

}
我希望在这个类中,当用户按下登录/注册按钮时,传递一个额外的参数。此参数用于在登录/注册阶段后向用户显示自定义信息。
更重要的是,现在,即使用户还没有帐户(所以他刚刚注册)或者他已经有一个帐户(他刚刚登录),我也无法区分这两个不同的过程。有没有办法得到不同的结果?

这对OAuth来说不是什么问题。用户是否登录到给定的应用程序应由该应用程序跟踪。考虑在你的应用程序中坚持登录甚至是一个标志。好的,你的意思是,使用JavaScript向后端发送一个请求,并在注册阶段存储用户选择并将其保存在某个地方?例如,如果他按下facebook登录按钮,我将在存储他选择facebook登录之前向我的后端发送一个请求,然后将请求发送到facebook?如果我正确理解了你的问题,你想在注册后触发一些行为吗?如果是这样,您就不会从前端传递此信息。例如,“你好,这是我第一次来这里”。您可以从后端跟踪它。即,此应用程序没有此用户以前登录的记录。这样,你的用户界面应该能够询问服务器是否是新用户(通过API调用),并决定他们是否需要查看你的注册信息。嗯,好的,我明白了。所以每次加载页面时,我都要问自己这是否是新用户。。。。在性能方面是否还不错?不太好。尽管这取决于应用程序的性质。如果您使用的是由API调用驱动的静态UI,那么每个会话调用一次就可以完成这项工作。另一方面,如果您使用的是服务器页面,您可以在其中使用逻辑来表示它们是新用户,将它们重定向到页面XIt,这对OAuth来说并不是一个真正的问题。用户是否登录到给定的应用程序应由该应用程序跟踪。考虑在你的应用程序中坚持登录甚至是一个标志。好的,你的意思是,使用JavaScript向后端发送一个请求,并在注册阶段存储用户选择并将其保存在某个地方?例如,如果他按下facebook登录按钮,我将在存储他选择facebook登录之前向我的后端发送一个请求,然后将请求发送到facebook?如果我正确理解了你的问题,你想在注册后触发一些行为吗?如果是这样,您就不会从前端传递此信息。例如,“你好,这是我第一次来这里”。您可以从后端跟踪它。即,此应用程序没有此用户以前登录的记录。这样,你的用户界面应该能够询问服务器是否是新用户(通过API调用),并决定他们是否需要查看你的注册信息。嗯,好的,我明白了。所以每次加载页面时,我都要问自己这是否是新用户。。。。在性能方面是否还不错?不太好。尽管这取决于应用程序的性质。如果您使用的是由API调用驱动的静态UI,那么每个会话调用一次就可以完成这项工作。另一方面,如果你使用的是服务器页面,你可以在那里有逻辑说他们是新用户,将他们重定向到页面X