2014-10-13 3 views
0

Я реализую безопасность в своем веб-сервисе RESTful, и я думаю о создании фильтра, который проверяет, является ли заголовок авторизации действительным или нет, и эта проверка выполняется путем отправки токен третьей стороне. Если токен действителен, конечная точка третьей стороны должна отправить мне ответ, содержащий информацию об истечении срока действия маркера, идентификатора клиента, области действия и других данных. Логика, то это:Сервлет фильтр «возвращающий» объект для последующего использования

@Override 
public void doFilter(
     final ServletRequest request, 
     final ServletResponse response, 
     final FilterChain chain) throws IOException, ServletException { 
    HttpServletRequest req = (HttpServletRequest) request; 
    header = req.getHeader("Authorization"); 
    EndpointResponse eResponse = Endpoint.validate(header); 
    if(eResponse.valid())){ 
     chain.doFilter(...); 
     return eResponse; //or equivalent 
    }else{ 
     HttpServletResponse res = HttpServletResponse(response); 
     res.setStatus(HttpServletResponse.SC_UNAUTHORIZED); 
     ... 
    } 
} 

Затем в классе DAO, я буду использовать eResponse как этот

public final class DAO{  
    public void checks(){ 
     if(eResponse.scope() == "ADMIN"){ 
      ... 
     }else{ 
      ... 
     } 
    } 
} 

Есть ли способ, чтобы ввести или вернуть объект после того, как фильтр делает подтверждение? Надеюсь, без использования весны или спящего режима, поскольку я не могу использовать их на своей работе.

-EDIT-

Путь я доступ к дао будет так

@Path("") 
public class CertificationService { 

    @GET 
    @Produces(CertificationApplication.SUPPORTED_REPRESENTATIONS) 
    @Path(CertificationConstants.URL_PATH) 
    public Response getCertificationByUpId(String upId) throws CertificationException {   
     ResponseBuilder response;  
     try{ 
      response = Response.ok(DAO.findCertificationByUPID(upId)); 
     } catch (CertificationException e) { 
      response = handleException(e); 
     } 
     return response.build(); 
    } 


} 

Метод findCertificationByUPID бы назвать чеки() метод, который я заявил выше.

+2

@JigarJoshi OP вопрос совсем нет об ошибке используя колонка сравнение. Он спрашивает, хороша ли его логика и как он должен это делать. – Alex

+1

мой плохой, вернул его –

+0

, вы можете передать его как аргумент DAO, откуда вы его назовете? –

ответ

1

Попробуйте поместить объект на запрос с помощью setAttribute():

request.setAttribute("auth", eResponse); 

Затем контроллер может захватить объект с помощью

EndpointResponse eResponse = (EndpointResponse) request.getAttribute("auth"); 

и делать все, что вы хотите с ним (в том числе передавая его DAO):

dao.checks(eResponse); 

где DAO это как что у вас есть выше, но с

public void checks(EndpointResponse eResponse) { ... } 

вместо этого.

Если вы предпочитаете держать EndpointResponse из-за DAO, вы можете сделать

public void checks(String role) { ... } 

или аналогичный.

+0

Должен ли объект eResponse быть статическим? Или как DAO сможет получить доступ к тому же объекту, что и тот, который используется в фильтре? – Nacho321

+0

Ваш DAO не должен быть привязан к ServletRequest вообще, это плохая практика. –

+1

@LuiggiMendoza: Согласен, но я считал, что это вне сферы его ближайшего вопроса. Просто согласился с дизайном, который он представил. –

Смежные вопросы