1 回答

TA貢獻(xiàn)1871條經(jīng)驗(yàn) 獲得超13個(gè)贊
您可能需要做一些事情:
編寫(xiě)一個(gè)安全過(guò)濾器來(lái)調(diào)用 FirebaseAuth 對(duì) Bearer Token 進(jìn)行身份驗(yàn)證。令牌經(jīng)過(guò)身份驗(yàn)證后,將其放入 SecurityContext 中。類(lèi)似于:
public class FirebaseFilter extends OncePerRequestFilter {
private static String AUTH_HEADER = "Authorization";
@Override
protected void doFilterInternal(HttpServletRequest request,
HttpServletResponse response,
FilterChain filterChain) throws ServletException, IOException {
String authToken = request.getHeader(AUTH_HEADER).substring(7);
if (!StringUtils.isEmpty(authToken)) {
Authentication auth = getAuthentication(authToken);
SecurityContextHolder.getContext().setAuthentication(auth);
logger.debug("Successfully Authenticated");
}
filterChain.doFilter(request, response);
}
private FirebaseToken verifyIdToken(String idToken) {
if (StringUtils.isEmpty(idToken)) {
throw new IllegalArgumentException("idToken is blank");
}
return FirebaseAuth.getInstance().verifyIdToken(idToken);
}
private Authentication getAuthentication(String idToken) {
FirebaseToken token = verifyIdToken(idToken);
assert token != null;
return new FirebaseAuthenticationToken(token.getUid(), token);
}
}
您將需要 UserDetailsService 的實(shí)現(xiàn),我相信您已經(jīng)有了。
您將需要一個(gè)安全提供程序,它從安全上下文中獲取身份驗(yàn)證,然后調(diào)用 UserDetailsService 來(lái)獲取應(yīng)用程序可能需要的任何信息。然后更新認(rèn)證對(duì)象。類(lèi)似于:
@Component
public class FirebaseAuthenticationProvider implements AuthenticationProvider {
private UserService userService;
@Autowired
public FirebaseAuthenticationProvider(UserService userService) {
this.userService = userService;
}
public Authentication authenticate(Authentication authentication) throws AuthenticationException {
if (!supports(authentication.getClass())) {
return null;
}
UserDetails details = userService.loadUserByUsername(authentication.getPrincipal()
.toString());
FirebaseToken token = (FirebaseToken) authentication.getCredentials();
if (details == null) {
details = userService.registerUser(token);
}
return new FirebaseAuthenticationToken(details, token, details.getAuthorities());
}
public boolean supports(Class<?> authentication) {
return (FirebaseAuthenticationToken.class.isAssignableFrom(authentication));
}
}
添加回答
舉報(bào)