当前位置 博文首页 > 无限迭代中......:Spring Security OAuth2——自定义OAuth2第三

    无限迭代中......:Spring Security OAuth2——自定义OAuth2第三

    作者:[db:作者] 时间:2021-07-19 19:24

    前文:Spring Security OAuth2——自定义OAuth2第三方登录(Gitee)?

    Maven

    主要

            <!--Spring Security-->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-security</artifactId>
            </dependency>
            <!--Spring Security OAuth2-->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-oauth2-client</artifactId>
            </dependency>

    解决方案

    实体类

    org.springframework.security.core.userdetails.UserDetailsService

    /**
     *  服务实现类
     *
     * @author ShenTuZhiGang
     * @version 1.0.0
     * @date 2021-02-15 15:05
     */
    @Service
    public class UserServiceImpl implements UserDetailsService {
    
        private final UserMapper userMapper;
    
        private final UserRoleMapper userRoleMapper;
    
        public UserServiceImpl(UserMapper userMapper, UserRoleMapper userRoleMapperr) {
            this.userMapper = userMapper;
            this.userRoleMapper = userRoleMapper;
        }
    
        /**
         * 加载指定用户
         * @param username 用户名
         * @return Spring Security UserDetails
         * @throws UsernameNotFoundException 用户不存在
         */
        @Override
        public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
            User user =  userMapper.selectUserByUserName(username);
            if(user == null){
                throw new UsernameNotFoundException("账号不存在");
            }
            UsernamePasswordAuthenticationUser authenticationUser = new UsernamePasswordAuthenticationUser();
            BeanUtils.copyProperties(user,authenticationUser);
            authenticationUser.setRoles(userRoleMapper.listRoleByUid(user.getId()));
            return authenticationUser;
        }
    }

    org.springframework.security.oauth2.client.userinfo.OAuth2UserService

    /**
     * @author ShenTuZhiGang
     * @version 1.0.0
     * @date 2021-03-16 02:13
     */
    @Service
    public class CustomOAuth2UserService extends CustomUserTypesOAuth2UserService {
    
        @Autowired
        private IUserService iUserService;
    
        @Autowired
        private IRoleService iRoleService;
    
        public CustomOAuth2UserService(Map<String, Class<? extends OAuth2User>> customUserTypes) {
            super(customUserTypes);
        }
        @Override
        public OAuth2User loadUser(OAuth2UserRequest userRequest) throws OAuth2AuthenticationException {
            OAuth2User oauth2User = super.loadUser(userRequest);
            User user =  iUserService.getById(1);
            if(user == null){
                user = iUserService.registerUser(oauth2User.getName(),"");
            }
            OAuth2AuthenticationUser authenticationUser = new OAuth2AuthenticationUser();
            BeanUtils.copyProperties(user,authenticationUser);
            authenticationUser.setSource(oauth2User);
            authenticationUser.setRoles(iRoleService.listRoleByUid(user.getId()));
            return authenticationUser;
        }
    }
    

    配置

    /**
     * @author ShenTuZhiGang
     * @version 1.0.0
     * @date 2021-03-16 02:27
     */
    @Configuration
    public class CustomOAuth2Config {
        @Bean
        public Map<String, Class<? extends OAuth2User>> customOAuth2UserTypes(){
            Map<String, Class<? extends OAuth2User>> map = new HashMap<>();
            map.put("github", GithubOAuth2User.class);
            map.put("gitee", GiteeOAuth2User.class);
            return map;
        }
    }
    

    WebSecurityConfigurerAdapter

        @Override
        protected void configure(HttpSecurity http)throws Exception{
     
                // OAuth2登录
                http.oauth2Login()
                        .redirectionEndpoint()
                        .baseUri("/login/oauth2/code/*")
                    .and()
                        .userInfoEndpoint()
                        .customUserType(GiteeOAuth2User.class,"gitee")
                    .and()
                    .permitAll()
        }

    application.yml?

    spring:
      # Security Config
      security:
        oauth2:
          client:
            registration:
              gitee:
                provider: gitee
                client-id: {mm}
                client-secret: {mm}
                authorization-grant-type: authorization_code
                redirect-uri: '{baseUrl}/login/oauth2/code/{registrationId}'
                scope: user_info
                client-name: Gitee
                client-alias: gitee
            provider:
              gitee:
                authorization-uri: https://gitee.com/oauth/authorize
                token-uri: https://gitee.com/oauth/token
                user-name-attribute: id
                user-info-uri: https://gitee.com/api/v5/user

    ?

    参考文章

    ?

    cs