私はウェブをかなり研究しましたが、私の問題に解決策はまだありません。私の場合に合わないものを使っているすべての人。私のscenerio:春のセキュリティ - コントローラからの値を読み取る
ユーザーはpost(email: "admin"、password: "admin")を送信します。入力が正しいかどうかをチェックし、そのトークンがヘッダ/
私はコントローラからSpring認証プロセスへの値を渡す部分についています。以下は
私の設定です:ここ
@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true, securedEnabled = true)
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
private TokenAuthenticationProvider tokenAuthenticationProvider;
@Autowired
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.authenticationProvider(this.tokenAuthenticationProvider);
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/login").permitAll()
.anyRequest().authenticated().and()
.csrf().disable();
}
}
は私のコントローラです:
@RestController
public class LoginController {
@Autowired
private AuthenticationManager authenticationManager;
@RequestMapping(value = "/login", method = RequestMethod.POST)
public ResponseEntity<?> login(@RequestBody LoginCredentials payload){
Authentication authentication = this.authenticationManager.authenticate(
new UsernamePasswordAuthenticationToken(
payload.getUsername(),
payload.getPassword()
)
);
SecurityContextHolder.getContext().setAuthentication(authentication);
return ResponseEntity.ok("OK");
}
}
、これは
@Component
public class TokenAuthenticationProvider implements AuthenticationProvider {
@Override
public Authentication authenticate(Authentication authentication) throws AuthenticationException {
if(authentication.getName().equals("admin") && authentication.getCredentials().equals("admin")) {
List<GrantedAuthority> grantedAuths = new ArrayList<>();
grantedAuths.add(new SimpleGrantedAuthority("ROLE_USER"));
grantedAuths.add(new SimpleGrantedAuthority("ROLE_ADMIN"));
return new UsernamePasswordAuthenticationToken(authentication.getName(), authentication.getCredentials(), grantedAuths);
} else {
return null;
}
}
@Override
public boolean supports(Class<? extends Object> authentication) {
return (UsernamePasswordAuthenticationToken.class.isAssignableFrom(authentication));
}
}
Imが資格情報を使用してPOSTリクエストを行うと、これは私の認証プロバイダであります答えイム取得:
{
"timestamp": 1486995388844,
"status": 403,
"error": "Forbidden",
"exception": "org.springframework.security.authentication.ProviderNotFoundException",
"message": "Access Denied",
"path": "/login"
}
Spring Securityをハッキングするのではなく、意図したとおりにフレームワークを使用してください。認証を行うためのフィルタを作成し、コントローラを使用してロックしないようにしてください。 –
@ M.Deinum。厳密には、フィルターで受信した認証情報を処理し、認証されていない認証を作成し、次にAuthenticationManagerによって処理され、役割を解決し、Authoriを作成する必要がありますzed認証を行い、トークンを返します。その後のリクエストでは、トークンは別のフィルタ内のトークンストア(db)に対して解決され、認証された認証(トークンが有効な場合)を作成し、 'SecurityContextHolder.getContext()。setAuthentication'を設定します。 –
ok 2つのフィルタが必要です。ログイン(ユーザー名、パスワード)からの入力が正しいかどうかをチェックし、有効なトークン(dbまたはJWTに格納されている可能性があります)を出したら、トークンが添付されているリクエスト? – filemonczyk