How to create my own filter with Spring MVC?

前端 未结 7 1549
名媛妹妹
名媛妹妹 2020-12-14 07:40

I use Spring MVC (4.0.1) as a backend for rest services and angularjs as frontend.

every request to my server backend has a http-header with a session id

I c

7条回答
  •  借酒劲吻你
    2020-12-14 08:00

    You can also implement it using an aspect with a pointcut that targets a certain annotation. I have written a library that enables you to use annotations that perform authorization checks based on a JWT token.

    You can find the project with all the documentation on: https://github.com/nille85/jwt-aspect. I have used this approach multiple times in order to secure a REST Backend that is consumed by a single page application.

    I have also documented on my blog how you can use it in a Spring MVC Application: http://www.nille.be/security/creating-authorization-server-using-jwts/

    The following is an extract from the example project on https://github.com/nille85/auth-server

    The example underneath contains a protected method getClient. The annotation @Authorize that the aspect uses checks if the value from the "aud jwt claim" matches the clientId parameter that is annotated with @ClaimValue. If it matches, the method can be entered. Otherwise an exception is thrown.

    @RestController
    @RequestMapping(path = "/clients")
    public class ClientController {
    
        private final ClientService clientService;
    
        @Autowired
        public ClientController(final ClientService clientService) {
            this.clientService = clientService;
        }
    
        @Authorize("hasClaim('aud','#clientid')")
        @RequestMapping(value = "/{clientid}", method = RequestMethod.GET, produces = "application/json")
        @ResponseStatus(value = HttpStatus.OK)
        public @ResponseBody Client getClient(@PathVariable(value = "clientid") @ClaimValue(value = "clientid") final String clientId) {
            return clientService.getClient(clientId);
        }
    
        @RequestMapping(value = "", method = RequestMethod.GET, produces = "application/json")
        @ResponseStatus(value = HttpStatus.OK)
        public @ResponseBody List getClients() {
            return clientService.getClients();
        }
    
    
        @RequestMapping(path = "", method = RequestMethod.POST, produces = "application/json")
        @ResponseStatus(value = HttpStatus.OK)
        public @ResponseBody Client registerClient(@RequestBody RegisterClientCommand command) {
            return clientService.register(command);
    
    
        }
    
    }
    

    The Aspect itself can be configured like:

    @Bean
    public JWTAspect jwtAspect() {
        JWTAspect aspect = new JWTAspect(payloadService());
        return aspect;
    }
    

    The PayloadService that is needed can for example be implemented like:

    public class PayloadRequestService implements PayloadService {
    
        private final JWTVerifier verifier;
    
        public PayloadRequestService(final JWTVerifier verifier){
            this.verifier = verifier;
        }
    
        @Override
        public Payload verify() {
            ServletRequestAttributes t = (ServletRequestAttributes) RequestContextHolder.currentRequestAttributes();
            HttpServletRequest request = t.getRequest();
    
            final String jwtValue = request.getHeader("X-AUTH");
            JWT jwt = new JWT(jwtValue);
            Payload payload =verifier.verify(jwt);
    
            return payload;
        }
    
    }
    

提交回复
热议问题