Spring Security

Securing the Catalog and Order Service

The objective of this exercise is to secure the catalog and order microservices using JSON web tokens for authentication.



Add the spring-boot-starter-security and spring-security-oauth2-jose dependencies to the Maven configurations of the microservices.

Authentication Provider

Implement a JwtAuthenticationProvider class that implements the AuthenticationProvider interface:
  • the supports method indicates that the provider only supports authentication tokens of type JwtAuthenticationToken
  • the authenticate method verifies a JwtAuthenticationToken using the JwtTokenVerifier helper class and returns an authenticated token or throws an exception

Authentication Filter

Implement a JwtAuthenticationFilter class that extends the OncePerRequestFilter:
  • Provide a constructor to inject an authentication manager
  • Override the doFilterInternal method as follows:
    • check if there is an authorization request header with scheme Bearer
    • create a JwtAuthenticationToken with the corresponding token
    • authenticate the JwtAuthenticationToken using the injected authentication manager
    • if the authentication succeeds, populate the security context with the authenticated token and save it to a RequestAttributeSecurityContextRepository, otherwise clear the security context

Security Configuration

Implement a configuration class SecurityConfig that provides the following bean methods:
  • authenticationManager creates an authentication manager with the JwtAuthenticationProvider added to it
  • securityFilterChain configures the HttpSecurity such that
    • the CSRF token is disabled
    • the JwtAuthenticationFilter is added to the filter chain
    • an entry point is defined that returns the status code 401 if authentication fails
    • the access to the REST endpoints is restricted as specified by the security requirements
    • no sessions are used
    and returns the corresponding SecurityFilterChain

Data Access

  • When a customer registers, retrieve his username from the authentication token and store it with the customer's other data
  • Use the saved username to ensure that a customer can only access his own data using one of the following options:
    • In the methods of the customer and order service, check the data access programmatically by retrieving the role and name of the authenticated user from the security context
    • Enable method security and annotate the service methods with appropriate method security expressions
    • Add the spring-security-data dependency and use query security expressions in the customer and order repositories
  • Ensure that employees can access all customer data.

Testing

Implement tests using the MockMvc bean and security test annotations to verify the required security constraints.