SpringCloud OAuth 2+JWT認証認可(二)リソースサーバ
6378 ワード
シリーズ記事
Spring Cloud oAuth 2(一)ライセンスサーバの構築とアクセス
Spring Cloud oAuth 2(二)リソースサーバの構築及びテスト
SpringCloud OAuth 2+JWT認証認証認証(一)認証サーバ
SpringCloud OAuth 2+JWT認証認可(二)リソースサーバ
目次
概要
エンティティオブジェクト
リソースサーバの構成
アクセス構成
ログインロジック
まとめ
概要
ここでは、第三者のライセンスサービスを構築する過程で、個人が直面した問題をまとめます.必要でないサードパーティのログインでなければ、単一のJWTで簡単な認証を満たすことができますが、関連する認証と認証は自分で書く必要があります.本明細書のソース:ソースアドレス.
エンティティオブジェクト
@Data
@Entity
public class Role implements GrantedAuthority, Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(nullable = false,unique = true)
private String name;
@Override
public String getAuthority() {
return name;
}
}
@Data
@Entity
public class User implements UserDetails, Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(nullable = false,unique = true)
private String username;
private String password;
@ManyToMany(cascade = CascadeType.ALL,fetch = FetchType.EAGER)
@JoinTable(
name = "user_role",
joinColumns = {@JoinColumn(name = "user_id",referencedColumnName = "id")},
inverseJoinColumns = {@JoinColumn(name="role_id",referencedColumnName = "id")}
)
List authorities;
@Override
public Collection extends GrantedAuthority> getAuthorities() {
return authorities;
}
@Override
public boolean isAccountNonExpired() {
return true;
}
@Override
public boolean isAccountNonLocked() {
return true;
}
@Override
public boolean isCredentialsNonExpired() {
return true;
}
@Override
public boolean isEnabled() {
return true;
}
}
@Data
public class MyJWT {
String access_token;
String token_type;
String expires_in;
String scope;
}
リソースサーバの構成
@Configuration
public class JwtConfig {
@Bean
public PasswordEncoder passwordEncoder()
{
return new BCryptPasswordEncoder();
}
@Bean
public TokenStore tokenStore()
{
return new JwtTokenStore(jwtAccessTokenConverter());
}
@Bean
public JwtAccessTokenConverter jwtAccessTokenConverter()
{
JwtAccessTokenConverter converter = new JwtAccessTokenConverter();
ClassPathResource resource = new ClassPathResource("public.cert");
try {
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(resource.getInputStream()));
String publicKey = bufferedReader.lines().collect(Collectors.joining("
"));
converter.setVerifierKey(publicKey);
} catch (IOException e) {
e.printStackTrace();
}
return converter;
}
}
注意:
@EnableResourceServer
@Configuration
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class ResourceServerConfig extends ResourceServerConfigurerAdapter {
@Autowired
public TokenStore tokenStore;
@Override
public void configure(ResourceServerSecurityConfigurer resources) throws Exception {
resources.tokenStore(tokenStore);
}
@Override
public void configure(HttpSecurity http) throws Exception {
http.csrf().disable()
.authorizeRequests()
.antMatchers("/user/login","/user/one").permitAll()
.anyRequest().authenticated();
}
}
アクセス構成
@Configuration
public class FeignConfig {
@Bean
public Retryer feignRetryer()
{
return new Retryer.Default(100,1000,5);
}
}
//feign serviceId
@FeignClient(value = "auth-service",fallback = FeignHystrix.class,configuration = FeignConfig.class)
public interface AuthService {
@PostMapping("/oauth/token")
MyJWT getToken(@RequestParam("client_id") String client_id, @RequestParam("client_secret")String client_secret,@RequestParam("username")String username,@RequestParam("password")String password, @RequestParam("grant_type") String grant_type);
}
//
@Component
public class FeignHystrix implements AuthService {
@Override
public MyJWT getToken(String client_id, String client_secret, String username, String password, String grant_type) {
System.out.println(" ");
return null;
}
}
ログインロジック
@Service
public class UserService {
@Autowired
private UserDao userDao;
@Autowired
private PasswordEncoder passwordEncoder;
@Autowired
private AuthService authService;
public void addUser(User user)
{
user.setPassword(passwordEncoder.encode(user.getPassword()));
userDao.save(user);
}
public MyResponse login(User user)
{
User findUser = userDao.findByUsername(user.getUsername());
if(null==findUser)
{
throw new MyException(" !",501);
}
else if(!passwordEncoder.matches(user.getPassword(),findUser.getPassword()))
{
throw new MyException(" !",502);
}
MyJWT token = authService.getToken("kevin", "kevin12345", user.getUsername(),user.getPassword(),"password");
return new MyResponse(token);
}
まとめ
個人的にプレイしている間にライセンスモードをclientに変更しましたcredentialsクライアント方式、また権限管理制御を追加して、アクセスはずっとアクセスできないことを表示して、愚かで長い間、それからやっと悟って、クライアント方式はデータベースに入って権限を取得していないので、権限はずっと空で、汗..ところで、現在のコードは完全ではありません.完全なコードが必要な場合は、ソースアドレスにアクセスしてください.