1 回答

TA貢獻1834條經驗 獲得超8個贊
對于遇到此問題的任何絕望的靈魂,這里是解決方案:
@RestController
public class MainLoginController {
@RequestMapping("/manuallogin")
ResponseEntity<Object> interceptLoginRequest ( ){
ServletRequestAttributes requestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
DefaultSavedRequest springSecuritySavedRequest = (DefaultSavedRequest) requestAttributes.getRequest()
.getSession()
.getAttribute( "SPRING_SECURITY_SAVED_REQUEST" );
queryString = springSecuritySavedRequest.getQueryString();
request.getSession().setAttribute( "queryString", queryString );
return ResponseEntity.status( HttpStatus.FOUND )
.location( URI.create( dinosaurServer.getLoginUrl() ) )
.build();
}
@RequestMapping("/handshakeWithDinosaur")
public ResponseEntity<Object> handshakeWithDinosaur ( String dinosaursToken ) {
Authentication authentication = this.authenticationManager.authenticate(
new UsernamePasswordAuthenticationToken(
dino.getUser(), dino.getPass()
)
);
SecurityContext sc = SecurityContextHolder.getContext();
sc.setAuthentication( authentication );
request.getSession().setAttribute( SPRING_SECURITY_CONTEXT_KEY, sc );
String queryString = String.valueOf( request.getSession().getAttribute( "queryString" ) );
return ResponseEntity.status( HttpStatus.FOUND )
.location( URI.create( String.format( "%s?%s",SPRING_AUTH_ENDPOINT, queryString ) ) )
.build();
}
@Component
public class AuthProviderForDinosaur implements AuthenticationProvider {
@Override
public Authentication authenticate ( Authentication authentication ) throws AuthenticationException {
List<GrantedAuthority> grantedAuths = new ArrayList<>();
grantedAuths.add( new SimpleGrantedAuthority( "ROLE_USER" ) );
return new UsernamePasswordAuthenticationToken( authentication.getName(), authentication.getCredentials(), grantedAuths );
}
@Override
public boolean supports ( Class<? extends Object> authentication ) {
return ( UsernamePasswordAuthenticationToken.class.isAssignableFrom( authentication ) );
}
}
基本上,我啟用了會話并讓 Spring 在會話中為我保存請求,同時服務器與恐龍服務器對話并完成握手。完成后,向 Spring 詢問先前請求的參數以通過 Spring Security 繼續授權。
添加回答
舉報