내 로그인 자원에 내 코드는 지금까지 여기 나는 응용 프로그램에 대한 불안 백엔드을하려면 JAX-RS 프레임 워크를 사용하고, 나는이 자원을, 사용자에게 권한을 부여하기 위해, 그들은 로그인으로, 그리고 :
@Path("authentication")
public class AuthenticationRessource {
private static Gson gson = new GsonBuilder().setPrettyPrinting().create();
private static AuthenticationFacade authenticationFacade = new AuthenticationFacade();
@GET
@Path("login")
@Produces(APPLICATION_JSON)
public Response authenticateUser(@FormParam("email") String email, @FormParam("password") String password) {
try {
//skal måske ændres til bruger
User user = authenticationFacade.authenticateUser(email, password);
String token = authenticationFacade.generateAuthenticationToken(user);
return Response.ok().header(AUTHORIZATION, "Bearer " + token).build();
} catch (Exception e) {
Response.status(Response.Status.UNAUTHORIZED).build();
System.err.print("det fuckede op, på grund af Thomas har ødelagt koden");
e.printStackTrace();
}
return Response.status(Response.Status.UNAUTHORIZED).build();
}
}
지금은 인증을위한 자원을 가지고 있지만, 아마도 이것이 내 사용자 자원의 내부에 속하는, 그리고 각 사용자 (사용자, 수퍼 유저, 관리자 등) 인증에 대한 경로를 지정해야합니다
나는 그것이 차이를 만들 것,이 자원을 위해, 공급자 주석을 추가해야 하는가?
내가 토큰을 추가 할 때이 헤더 할 수있는 권한을 추가 할 수있는 최선의 방법인가?
: 나는 떨어져 JHipster 발생기에 의해 생성 된 응용 프로그램으로 내 의사 결정의 많은 모델 있음을 설명하여이 서문합니다 https://www.jhipster.tech/security/
대신 공인 반환 또는 권한이없는은 / 인증하고 엔드 포인트, 나는 JWT를 반환합니다. 은 / 인증합니다 엔드 포인트는 로그인 단계에서 공격하고 JWT가 저장됩니다. 다음 예를 참조하십시오 :
@PostMapping("/authenticate")
@Timed
public ResponseEntity<JWTToken> authorize(@Valid @RequestBody LoginVM loginVM) {
UsernamePasswordAuthenticationToken authenticationToken =
new UsernamePasswordAuthenticationToken(loginVM.getUsername(), loginVM.getPassword());
Authentication authentication = this.authenticationManager.authenticate(authenticationToken);
SecurityContextHolder.getContext().setAuthentication(authentication);
boolean rememberMe = (loginVM.isRememberMe() == null) ? false : loginVM.isRememberMe();
String jwt = tokenProvider.createToken(authentication, rememberMe);
HttpHeaders httpHeaders = new HttpHeaders();
httpHeaders.add(JWTFilter.AUTHORIZATION_HEADER, "Bearer " + jwt);
return new ResponseEntity<>(new JWTToken(jwt), httpHeaders, HttpStatus.OK);
}
나는 다음 필터를 통해 API 엔드 포인트는 사용자가 아직 인증을 거치지 않거나 인증되지 않은 여부를 확인하는 데 사용되는 모든 시간을 저장 토큰을 실행할 수 있습니다 :
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain)
throws IOException, ServletException {
HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;
String jwt = resolveToken(httpServletRequest);
if (StringUtils.hasText(jwt) && this.tokenProvider.validateToken(jwt)) {
Authentication authentication = this.tokenProvider.getAuthentication(jwt);
SecurityContextHolder.getContext().setAuthentication(authentication);
}
filterChain.doFilter(servletRequest, servletResponse);
}
그리고 토큰 JWT를 해결하기 위해 :
private String resolveToken(HttpServletRequest request){
String bearerToken = request.getHeader(AUTHORIZATION_HEADER);
if (StringUtils.hasText(bearerToken) && bearerToken.startsWith("Bearer ")) {
return bearerToken.substring(7, bearerToken.length());
}
return null;
}
AUTHORIZATION_HEADER은 단순히 "인증"입니다 :
public static final String AUTHORIZATION_HEADER = "Authorization";
난 당신이 어려움을 겪고 있다면 당신은 아마 추론,하지만 난 JHipster 모노리스 응용 프로그램을 생성하고 먼저 손을 당신이 후 자신의 구현을 모델링 할 수 JWT의 좋은 구현을 참조하시기 바랍니다 할 수있는이 응답에 포함되지 않은 일부 누락 된 부분이있다 . 이것은 자바, 봄, 메이븐 응용 프로그램에 대한 도움말 내 이동-TOS 중 하나입니다.