web-dev-qa-db-ja.com

Spring Bootはコントローラを介して認証からユーザー名を取得します

問題:文字列の解析を使用せずに、可能であれば、authenticate.getName()からのみユーザー名/電子メールを取得/抽出したい。

authentication.getName()またはprincipal.getName()の値:

[username]: org.springframework.security.core.userdetails.User@21463e7a: Username: [email protected]; Password: [PROTECTED]; Enabled: true; AccountNonExpired: true; credentialsNonExpired: true; AccountNonLocked: true; Not granted any authorities

この例では、butitoy @ iyotbihagay.comであるUsernameの値のみを取得します。

ソリューション:

ユーザー名/メール([email protected])のみを取得し、プリンシパルコンテンツ/テキスト全体(上記)を返すため、件名に設定した値をプリンシパル値から...に置き換えました。電子メールの値..そしてそれは今動作します。

@Override
protected void successfulAuthentication(HttpServletRequest req,
                                        HttpServletResponse res,
                                        FilterChain chain,
                                        Authentication auth) throws IOException, ServletException {
    String email = auth.getName();
    String principal = auth.getPrincipal().toString();
    Date expiration = new Date(System.currentTimeMillis() + SecurityConstants.EXPIRATION_TIME);
    String token = Jwts.builder()
            .setSubject(email) //from principal to email
            .setExpiration(expiration)
            .signWith(SignatureAlgorithm.HS512, SecurityConstants.SECRET.getBytes())
            .compact();
    AuthenticatedUser loginUser = new AuthenticatedUser(email);
    loginUser.setToken(token);
    String jsonUser = Util.objectToJsonResponseAsString(loginUser, "user");
    res.addHeader(SecurityConstants.HEADER_STRING, SecurityConstants.TOKEN_PREFIX + token);
    res.setContentType("application/json");
    res.setCharacterEncoding(ConstantUtil.DEFAULT_ENCODING);
    res.getWriter().write(jsonUser);
}

これで、皆さんが提案している方法など、さまざまな方法を使用してユーザー名/電子メールの値を取得できます。現在使用している方法でも可能です。 Authenticationオブジェクトからemail値を取得するためだけに、特別な解析は必要ありません。

Springを使用した以前のREST以外のアプリケーションでは、コントローラーメソッドパラメーターに挿入された認証クラスを使用してユーザー名を簡単に取得できます。

コントローラ:

...  
public Ticket getBySwertresNo(Authentication authentication, @PathVariable String swertresNo) {  
    logger.debug("Inside getBySwertresNo: " + swertresNo);  
    System.out.println("\n[username]: " + authentication.getName() + "\n");  
    return m_sugalService.getSwertresInfoBySwertresNo(swertresNo);  
}  
...  

コンソール:

[username]: [email protected]

現在、私の現在のプロジェクトでは... RESTfulなアプローチを使用しており、認証が成功した後、リクエストヘッダーで使用/挿入されるトークンを返しています。トークンを使用してログインできますが、authentication.getName()の値を取得すると、返されるのはメールアドレスだけではなく、他の情報も含まれています。

コンソール(REST + JWT):

[username]: org.springframework.security.core.userdetails.User@21463e7a: Username: [email protected]; Password: [PROTECTED]; Enabled: true; AccountNonExpired: true; credentialsNonExpired: true; AccountNonLocked: true; Not granted any authorities

[email protected]」というユーザー名の値のみを取得したいのですが。

JWT認証フィルター:

public class JWTAuthenticationFilter extends UsernamePasswordAuthenticationFilter {

    private AuthenticationManager authenticationManager;

    public JWTAuthenticationFilter(AuthenticationManager authenticationManager) {
        this.authenticationManager = authenticationManager;
    }

    @Override
    public Authentication attemptAuthentication(HttpServletRequest req,
                                                HttpServletResponse res) throws AuthenticationException {
        String username = req.getParameter("username");
        String password = req.getParameter("password");
        UsernamePasswordAuthenticationToken authenticationToken = new UsernamePasswordAuthenticationToken(username, password);
        Authentication authentication = authenticationManager.authenticate(authenticationToken);
        return authentication;
    }

    @Override
    protected void successfulAuthentication(HttpServletRequest req,
                                            HttpServletResponse res,
                                            FilterChain chain,
                                            Authentication auth) throws IOException, ServletException {
        String email = auth.getName();
        String principal = auth.getPrincipal().toString();
        Date expiration = new Date(System.currentTimeMillis() + SecurityConstants.EXPIRATION_TIME);
        String token = Jwts.builder()
                .setSubject(principal)
                .setExpiration(expiration)
                .signWith(SignatureAlgorithm.HS512, SecurityConstants.SECRET.getBytes())
                .compact();
        AuthenticatedUser loginUser = new AuthenticatedUser(email);
        loginUser.setToken(token);
        String jsonUser = Util.objectToJsonResponseAsString(loginUser, "user");
        res.addHeader(SecurityConstants.HEADER_STRING, SecurityConstants.TOKEN_PREFIX + token);
        res.setContentType("application/json");
        res.setCharacterEncoding(ConstantUtil.DEFAULT_ENCODING);
        res.getWriter().write(jsonUser);
    }

}

JWT許可フィルター:

public class JWTAuthorizationFilter extends BasicAuthenticationFilter {

    public JWTAuthorizationFilter(AuthenticationManager authManager) {
        super(authManager);
    }

    @Override
    protected void doFilterInternal(HttpServletRequest req,
                                    HttpServletResponse res,
                                    FilterChain chain) throws IOException, ServletException {
        String header = req.getHeader(SecurityConstants.HEADER_STRING);

        if (header == null || !header.startsWith(SecurityConstants.TOKEN_PREFIX)) {
            chain.doFilter(req, res);
            return;
        }

        UsernamePasswordAuthenticationToken authentication = getAuthentication(req);

SecurityContextHolder.getContext().setAuthentication(authentication);
        chain.doFilter(req, res);
    }

    private UsernamePasswordAuthenticationToken getAuthentication(HttpServletRequest request) {
        String token = request.getHeader(SecurityConstants.HEADER_STRING);
        if (token != null) {
            // parse the token.
            String user = Jwts.parser()
                    .setSigningKey(SecurityConstants.SECRET.getBytes())
                    .parseClaimsJws(token.replace(SecurityConstants.TOKEN_PREFIX, ""))
                    .getBody()
                    .getSubject();

            if (user != null) {
                return new UsernamePasswordAuthenticationToken(user, null, new ArrayList<>());
            }
            return null;
        }
        return null;
    }

}
2
Borgy Manotoy

あなたの質問を見ました。以下のいくつかを試すことができると思います。

  • 注入コントローラで認証またはプリンシパル

    @Controller
    @RequestMapping("/info")
    public class GetNameController {
    
        @RequestMapping(value = "/name", method = RequestMethod.GET)
        public String getName(Authentication authentication,Principal principal) {
            System.out.println(authentication.getName());
            System.out.println("-----------------");
            System.out.println(principal.getName());
            return "";
        }
    }
    
  • 出力:

    admin
    -----------------
    admin
    
  • こんな風に書けると思います。

  • ありがとう
5
Richard li

Authentication/Principalオブジェクトに関する限り、トークンを使用しているか、Spring Securityの基本認証を使用しているかは関係ありません。

春のセキュリティの場合、次の方法で現在ログインしているユーザーを取得できます
1。 _Object user = Authentication authentication_(すでに行っているように)
2。

_Object user = SecurityContextHolder.getContext().getAuthentication()
                    .getPrincipal();
_

どちらの場合も、userには、UserDetailsService.loadUserByUsername(...)から返されたユーザーオブジェクトが含まれます。したがって、デフォルトのUserDetailsServiceを使用すると、Userusernameなどの基本的なユーザー情報を含むSpring Securityのpasswordオブジェクトを取得できます。

したがって、デフォルトのSpringのUserDetailsServiceを使用している場合は、次のようにして現在のログインユーザーを取得できます。

_UserDetails userDetails = (UserDetails) SecurityContextHolder.getContext().getAuthentication()
                        .getPrincipal();
String username = userDetails.getUsername();
_
2
Afridi

使用できます

import org.springframework.security.core.Authentication;

import org.springframework.security.core.context.SecurityContextHolder;

Authentication auth = SecurityContextHolder.getContext().getAuthentication();



   System.out.println("--------------------------------------------------------------");
    JwtUser jwtUser = (JwtUser) auth.getPrincipal();

    //Get the username of the logged in user: getPrincipal()
    System.out.println("auth.getPrincipal()=>"+jwtUser.getUsername() );
    //Get the password of the authenticated user: getCredentials()
    System.out.println("auth.getCredentials()=>"+auth.getCredentials());
    //Get the assigned roles of the authenticated user: getAuthorities()
    System.out.println("auth.getAuthorities()=>"+auth.getAuthorities());
    //Get further details of the authenticated user: getDetails()
    System.out.println("auth.getDetails()=>"+auth.getDetails());
    System.out.println("--------------------------------------------------------------");
0
vaquar khan