2017-11-25 9 views
0

私はJAVAを使用して残りのAPIを学習しており、認証以外のほとんどを完了しています。私は2つのJava Webサービスbuyerservicesellerserviceを作成しました。その中には、特定のパスを持つ多くのサブサービスがあります。休憩中の別のサービスの認証API

上記のサービスに対して別個の認証を作成して、売り手が売り手サービスにアクセスし、買い手が買い手サービスにアクセスできるようにします。現在、私は上記のサービスごとにフィルタクラスと2つの認証サービスクラスBuyerAuthServiceSellerAuthServiceを作成しました。ログインサーブレットでは、認証後、usernameとpasswordのコード化されたbase64の値をCookieの "Authorization"タグの下に追加します。だから、フィルタークラスで毎回クッキーを取得し、それらを検証します。

これは、フィルタクラスです:

package com.shopping.client; 

import java.io.IOException; 
import java.util.Base64; 
import java.util.StringTokenizer; 

import javax.servlet.FilterChain; 
import javax.servlet.FilterConfig; 
import javax.servlet.ServletException; 
import javax.servlet.ServletRequest; 
import javax.servlet.ServletResponse; 
import javax.servlet.http.Cookie; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 

public class RestAuthenticationFilter implements javax.servlet.Filter { 
    public static final String AUTHENTICATION_HEADER = "Authorization"; 

    @Override 
    public void doFilter(ServletRequest request, ServletResponse response, 
      FilterChain filter) throws IOException, ServletException { 
     if (request instanceof HttpServletRequest) { 
      HttpServletRequest httpServletRequest = (HttpServletRequest) request; 
      Cookie[] cookies = httpServletRequest.getCookies(); 
      String authCredentials = ""; 
      for (int i = 0; i < cookies.length; i++) { 
        String name = cookies[i].getName(); 
        String value = cookies[i].getValue(); 
        if(name.equals(AUTHENTICATION_HEADER)){ 
         authCredentials = value; 
        } 
       } 

      //System.out.println(authCredentials); 
      // better injected 
      final String encodedUserPassword = authCredentials.replaceFirst("Basic" 
        + " ", ""); 
      String usernameAndPassword = null; 
      try { 
       byte[] decodedBytes = Base64.getDecoder().decode(
         encodedUserPassword); 
       usernameAndPassword = new String(decodedBytes, "UTF-8"); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
      final StringTokenizer tokenizer = new StringTokenizer(
        usernameAndPassword, ":"); 
      final String username = tokenizer.nextToken(); 
      final String password = tokenizer.nextToken(); 
      boolean authenticationStatus = false; 

      if(username.equals("buyerservice")){ 

       BuyerAuthService buyAuth = new BuyerAuthService(); 
       authenticationStatus = buyAuth.authenticate(username, password); 
      } 
      else if(username.equals("sellerservice")) 
      { 
       SellerAuthService sellAuth = new SellerAuthService(); 
       authenticationStatus = sellAuth.authenticate(username, password); 
      } 

      if (authenticationStatus) { 
       filter.doFilter(request, response); 
      } else { 
       if (response instanceof HttpServletResponse) { 
        HttpServletResponse httpServletResponse = (HttpServletResponse) response; 
        httpServletResponse 
          .setStatus(HttpServletResponse.SC_UNAUTHORIZED); 
       } 
      } 
     } 
    } 

    @Override 
    public void destroy() { 
    } 

    @Override 
    public void init(FilterConfig arg0) throws ServletException { 
    } 
} 

これは私のバイヤー認証サービスクラスのメソッドです:

public class BuyerAuthService { 

    public boolean authenticate(String username, String password) { 

     if (null == username) 
      return false; 
     boolean authenticationStatus = "buyerservice".equals(username) 
       && "buyerservice".equals(password); 
     return authenticationStatus; 
    } 
} 

売り手認証サービスは、ユーザー名とパスワードなどの変更以外は上記と同じです。

私がloginservletは次のとおりです。

String authStringEnc = Base64.getEncoder().encodeToString(authString.getBytes("utf-8")); 
System.out.println("Base64 encoded auth string: " + authStringEnc); 
if(username.equals("sellerservice")){ 
    SellerAuthService sellAuth = new SellerAuthService(); 
    if(sellAuth.authenticate(username, password)){ 
     Cookie cookie = new Cookie("Authorization", authStringEnc); 
     response.addCookie(cookie); 
     System.out.println("HeaderSet"); 
     response.sendRedirect(URL); 
    } 
    else{ 

     response.sendError(404, "Wrong username password combination"); 
    } 
} 
else if(username.equals("buyerservice")){ 
    BuyerAuthService buyAuth = new BuyerAuthService(); 
    if(buyAuth.authenticate(username, password)){ 
     Cookie cookie = new Cookie("Authorization", authStringEnc); 
     response.addCookie(cookie); 
     System.out.println("HeaderSet"); 
     response.sendRedirect(URL); 
    } 
    else{ 
     response.sendError(404, "Wrong username password combination"); 
    } 
} 
else{ 
    response.sendError(404, "Username doesn't exists"); 
} 

私はログインフォームから自分のユーザー名とパスワードを取得します。

上記のフィルタクラスの問題は、sellerserviceにログインしていて、buyerserviceのURLにアクセスしようとしてもアクセスできます。 しかし、私はそれらを不正なHTMLページにリダイレクトしたい。私がここにこだわっているので、提案して助けてください。私は認証に新しいので、適切なガイダンスは私にとっても役に立ちます。前もって感謝します。!

答えて

0

サービスごとに別々のフィルタを追加し、同じフィルタ情報をweb.xmlファイルに追加しました。

私のweb.xmlファイルは

<?xml version="1.0" encoding="UTF-8"?> 
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0"> 
    <display-name>ElectronicsShopping</display-name> 
    <welcome-file-list> 
    <welcome-file>index.html</welcome-file> 
    <welcome-file>index.htm</welcome-file> 
    <welcome-file>LoginServlet.jsp</welcome-file> 
    <welcome-file>default.html</welcome-file> 
    <welcome-file>default.htm</welcome-file> 
    <welcome-file>default.jsp</welcome-file> 
    </welcome-file-list> 
    <servlet> 
    <servlet-name>Electronic Shopping</servlet-name> 
    <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class> 
    <init-param> 
     <param-name>jersey.config.server.provider.packages</param-name> 
     <param-value>com.shopping.client,com.jersey.jaxb,com.fasterxml.jackson.jaxrs.json</param-value> 
    </init-param> 
    <load-on-startup>1</load-on-startup> 
    </servlet> 
    <servlet-mapping> 
    <servlet-name>Electronic Shopping</servlet-name> 
    <url-pattern>/rest/*</url-pattern> 
    </servlet-mapping> 
    <filter> 
    <filter-name>SellerAuthenticationFilter</filter-name> 
    <filter-class>com.shopping.client.SellerAuthenticationFilter</filter-class> 
    </filter> 
    <filter> 
    <filter-name>BuyerAuthenticationFilter</filter-name> 
    <filter-class>com.shopping.client.BuyerAuthenticationFilter</filter-class> 
    </filter> 
    <filter-mapping> 
    <filter-name>SellerAuthenticationFilter</filter-name> 
    <url-pattern>/rest/sellerservice/*</url-pattern> 
    </filter-mapping> 
    <filter-mapping> 
    <filter-name>BuyerAuthenticationFilter</filter-name> 
    <url-pattern>/rest/buyerservice/*</url-pattern> 
    </filter-mapping> 
</web-app> 
です