AuthorizationServerConfiguration.java
@Configuration
@EnableAuthorizationServer
public class AuthorizationServerConfiguration extends AuthorizationServerConfigurerAdapter {
@Autowired
private AuthenticationManager authenticationManager;
@Autowired
private JwtAccessTokenConverter jwtAccessTokenConverter;
@Autowired
private ClientDetailsService jdbcClientDetailsService;
@Autowired
private AuthorizationCodeServices authorizationCodeServices;
@Autowired
private ApprovalStore approvalStore;
@Autowired
private TokenStore tokenStore;
@Autowired
private OauthTokenEnhancer oauthTokenEnhancer;
@Override
public void configure(AuthorizationServerEndpointsConfigurer endpoints) {
endpoints.authenticationManager(authenticationManager);
endpoints.accessTokenConverter(jwtAccessTokenConverter);
endpoints.authorizationCodeServices(authorizationCodeServices);
endpoints.approvalStore(approvalStore);
endpoints.tokenStore(tokenStore);
TokenEnhancerChain enhancerChain = new TokenEnhancerChain();
List<TokenEnhancer> delegates = new ArrayList<>();
delegates.add(oauthTokenEnhancer);
delegates.add(jwtAccessTokenConverter);
enhancerChain.setTokenEnhancers(delegates);
endpoints.tokenEnhancer(enhancerChain);
}
@Override
public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
clients.withClientDetails(jdbcClientDetailsService);
}
@Override
public void configure(AuthorizationServerSecurityConfigurer security) {
security.allowFormAuthenticationForClients()
.tokenKeyAccess("permitAll()")
.checkTokenAccess("permitAll()");
}
}
JwtTokenConfiguration.java
@Configuration
public class JwtTokenConfiguration {
@Bean
public JwtAccessTokenConverter jwtAccessTokenConverter() {
return new JwtAccessTokenConverter();
}
}
WebSecurityConfiguration.java
@Configuration
@EnableWebSecurity
public class WebSecurityConfiguration extends WebSecurityConfigurerAdapter {
@Autowired
private DataSource dataSource;
@Autowired
private UserAuthService userAuthService;
@Bean
public BCryptPasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
@Bean
public AuthorizationCodeServices authorizationCodeServices() {
return new JdbcAuthorizationCodeServices(dataSource);
}
@Bean
public ApprovalStore approvalStore() {
return new JdbcApprovalStore(dataSource);
}
@Bean
public TokenStore tokenStore() {
return new JdbcTokenStore(dataSource);
}
@Bean
public OauthTokenEnhancer oauthTokenEnhancer() {
return new OauthTokenEnhancer();
}
@Bean
public ClientDetailsService jdbcClientDetailsService() {
return new JdbcClientDetailsService(dataSource);
}
@Bean
@Override
public AuthenticationManager authenticationManagerBean() throws Exception {
return super.authenticationManagerBean();
}
@Override
protected void configure(AuthenticationManagerBuilder auth) {
DaoAuthenticationProvider authProvider = new DaoAuthenticationProvider();
authProvider.setPasswordEncoder(passwordEncoder());
authProvider.setUserDetailsService(userAuthService);
auth.authenticationProvider(authProvider);
}
}
OauthController.java
@RestController
@RequestMapping("/oauth")
public class OauthController {
@Autowired
private TokenEndpoint tokenEndpoint;
@GetMapping("/token")
public Oauth getAccessToken(Principal principal, @RequestParam Map<String, String> parameters) throws HttpRequestMethodNotSupportedException {
return tokenInfo(tokenEndpoint.getAccessToken(principal, parameters).getBody());
}
@PostMapping("/token")
public Oauth postAccessToken(Principal principal, @RequestParam Map<String, String> parameters) throws HttpRequestMethodNotSupportedException {
return tokenInfo(tokenEndpoint.postAccessToken(principal, parameters).getBody());
}
private Oauth tokenInfo(OAuth2AccessToken accessToken) {
DefaultOAuth2AccessToken token = (DefaultOAuth2AccessToken) accessToken;
token.getAdditionalInformation().remove("jti");
LinkedHashMap<String, Object> data = new LinkedHashMap<>(token.getAdditionalInformation());
data.put("accessToken", token.getValue());
return Oauth.build(data);
}
}
UserAuthMapper.java
public interface UserAuthMapper extends BaseMapper<UserAuth> {
}
Oauth.java
@Data
@AllArgsConstructor
@JsonInclude(JsonInclude.Include.NON_NULL)
public class Oauth {
private int code;
private String message;
private Object data;
public static Oauth build(Object data) {
return new Oauth(200, "成功", data);
}
}
UserAuth.java
@Data
@TableName("user_auths")
public class UserAuth {
private String userId;
private String identityType;
private String identifier;
private String credential;
}
OauthTokenEnhancer.java
public class OauthTokenEnhancer implements TokenEnhancer {
@Override
public OAuth2AccessToken enhance(OAuth2AccessToken accessToken, OAuth2Authentication authentication) {
User user = (User) authentication.getPrincipal();
Map<String, Object> map = new LinkedHashMap<>();
map.put("client_id", authentication.getOAuth2Request().getClientId());
map.put("username", user.getUsername());
((DefaultOAuth2AccessToken) accessToken).setAdditionalInformation(map);
return accessToken;
}
}
UserAuthService.java
@Service
public class UserAuthService implements UserDetailsService {
@Autowired
private UserAuthMapper userAuthMapper;
@Override
public UserDetails loadUserByUsername(String username) {
QueryWrapper<UserAuth> queryWrapper = new QueryWrapper<>();
queryWrapper.lambda().eq(UserAuth::getIdentifier, username);
UserAuth userAuth = userAuthMapper.selectOne(queryWrapper);
if (userAuth == null) {
throw new UsernameNotFoundException("账号不存在");
}
List<GrantedAuthority> list = AuthorityUtils.commaSeparatedStringToAuthorityList("ROOT_USER");
return new User(userAuth.getIdentifier(), userAuth.getCredential(), list);
}
}
OauthDemoApplication.java
@SpringBootApplication
@MapperScan("com.scut.oauthdemo.mapper")
public class OauthDemoApplication {
public static void main(String[] args) {
SpringApplication.run(OauthDemoApplication.class, args);
}
}
原创文章,作者:kirin,如若转载,请注明出处:https://blog.ytso.com/276776.html