package com.moral.security.auth.jwt; import com.moral.security.auth.JwtAuthenticationToken; import com.moral.security.auth.login.LoginMode; import com.moral.security.config.JwtSettings; import com.moral.security.model.UserContext; import com.moral.security.model.token.JwtToken; import com.moral.security.model.token.RawAccessJwtToken; import io.jsonwebtoken.Claims; import io.jsonwebtoken.Jws; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.authentication.AuthenticationProvider; import org.springframework.security.core.Authentication; import org.springframework.security.core.AuthenticationException; import org.springframework.security.core.GrantedAuthority; import org.springframework.security.core.authority.SimpleGrantedAuthority; import org.springframework.stereotype.Component; import java.util.List; import java.util.stream.Collectors; /** * An {@link AuthenticationProvider} implementation that will use provided * instance of {@link JwtToken} to perform authentication. * * @author vladimir.stankovic * * Aug 5, 2016 */ @Component @SuppressWarnings("unchecked") public class JwtAuthenticationProvider implements AuthenticationProvider { private final JwtSettings jwtSettings; @Autowired public JwtAuthenticationProvider(JwtSettings jwtSettings) { this.jwtSettings = jwtSettings; } /** * 封装认证凭证信息(包括组织信息和角色) * @param authentication * @return * @throws AuthenticationException */ @Override public Authentication authenticate(Authentication authentication) throws AuthenticationException { RawAccessJwtToken rawAccessToken = (RawAccessJwtToken) authentication.getCredentials(); Jws jwsClaims = rawAccessToken.parseClaims(jwtSettings.getTokenSigningKey()); String subject = jwsClaims.getBody().getSubject(); Integer orgId = Integer.valueOf(jwsClaims.getBody().get("oid").toString()); LoginMode mode = LoginMode.valueOf(jwsClaims.getBody().get("mode").toString()); List scopes = jwsClaims.getBody().get("scopes", List.class); List authorities = scopes.stream() .map(SimpleGrantedAuthority::new) .collect(Collectors.toList()); UserContext context = UserContext.create(subject,mode,orgId,authorities); return new JwtAuthenticationToken(context, context.getAuthorities()); } @Override public boolean supports(Class authentication) { return (JwtAuthenticationToken.class.isAssignableFrom(authentication)); } }