Spring Security Token based Authentication

后端 未结 2 496
误落风尘
误落风尘 2020-12-04 09:22

I have a rest api where I am authenticating using spring security Basic Authorization where client sends username and password for each request. Now, I wanted to implement t

相关标签:
2条回答
  • 2020-12-04 09:37

    Here is how I was able to implement token based authentication and basic authentication

    SpringSecurityConfig.java

    @Configuration
    @EnableWebSecurity
    public class SecurityConfig extends WebSecurityConfigurerAdapter
    {
    
        @Override
        public void configure(final AuthenticationManagerBuilder auth) throws Exception
        {
            auth.userDetailsService(this.participantService).passwordEncoder(this.passwordEncoder());
        }
    
        @Override
        protected void configure(final HttpSecurity http) throws Exception
        {
    
            //Implementing Token based authentication in this filter
            final TokenAuthenticationFilter tokenFilter = new TokenAuthenticationFilter();
            http.addFilterBefore(tokenFilter, BasicAuthenticationFilter.class);
    
            //Creating token when basic authentication is successful and the same token can be used to authenticate for further requests
            final CustomBasicAuthenticationFilter customBasicAuthFilter = new CustomBasicAuthenticationFilter(this.authenticationManager() );
            http.addFilter(customBasicAuthFilter);
    
        }
    }
    

    TokenAuthenticationFilter.java

        public class TokenAuthenticationFilter extends GenericFilterBean
        {
    
    
            @Override
            public void doFilter(final ServletRequest request, final ServletResponse response, final FilterChain chain)
                    throws IOException, ServletException
            {
                final HttpServletRequest httpRequest = (HttpServletRequest)request;
    
                 //extract token from header
                final String accessToken = httpRequest.getHeader("header-name");
                if (null != accessToken) {
               //get and check whether token is valid ( from DB or file wherever you are storing the token)
    
              //Populate SecurityContextHolder by fetching relevant information using token
                   final User user = new User(
                                "username",
                                "password",
                                true,
                                true,
                                true,
                                true,
                                authorities);
                        final UsernamePasswordAuthenticationToken authentication =
                                new UsernamePasswordAuthenticationToken(user, null, user.getAuthorities());
                        SecurityContextHolder.getContext().setAuthentication(authentication);
    
                }
    
                chain.doFilter(request, response);
            }
    
          }
    

    CustomBasicAuthenticationFilter.java

    @Component
    public class CustomBasicAuthenticationFilter extends BasicAuthenticationFilter {
    
    
        @Autowired
        public CustomBasicAuthenticationFilter(final AuthenticationManager authenticationManager) {
            super(authenticationManager);
        }
    
        @Override
        protected void onSuccessfulAuthentication(final javax.servlet.http.HttpServletRequest request, final javax.servlet.http.HttpServletResponse response, final Authentication authResult) {
            //Generate Token
            //Save the token for the logged in user
            //send token in the response
            response.setHeader("header-name" , "token");
    
    
        }
    
    }
    

    As our CustomBasicAuthenticationFilter has been configured and added as a filter to the spring security,

    Whenever basic authentication is successful the request will be redirected to onSuccessfulAuthentication where we set the token and send it in the response with some header "header-name".

    If "header-name" is sent for further request, then the request will go through TokenAuthenticationFilter first before attempting to try Basic Authentication.

    0 讨论(0)
  • 2020-12-04 09:50

    You can try setting your custom AuthenticationToken token in your authentication filter, for example:

    public class AuthenticationFilter extends GenericFilterBean {
        @Override
        public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
            final String authTokenHeader = ((HttpServletRequest)request).getHeader(Constants.AUTH_HEADER_NAME);
    
            if (authTokenHeader != null) {
                SecurityContextHolder.getContext().setAuthentication(createAuthenticationToken(authTokenHeader));
            }
    
            chain.doFilter( request, response );
        }
    }
    
    0 讨论(0)
提交回复
热议问题