私はJAVAを使用して残りのAPIを学習しており、認証以外のほとんどを完了しています。私は2つのJava Webサービスbuyerservice
とsellerservice
を作成しました。その中には、特定のパスを持つ多くのサブサービスがあります。休憩中の別のサービスの認証API
上記のサービスに対して別個の認証を作成して、売り手が売り手サービスにアクセスし、買い手が買い手サービスにアクセスできるようにします。現在、私は上記のサービスごとにフィルタクラスと2つの認証サービスクラスBuyerAuthService
とSellerAuthService
を作成しました。ログインサーブレットでは、認証後、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ページにリダイレクトしたい。私がここにこだわっているので、提案して助けてください。私は認証に新しいので、適切なガイダンスは私にとっても役に立ちます。前もって感謝します。!