Spring SecurityおよびOAuth 2.0を使用したログイン機能(04-05)
6565 ワード
04.声明に基づいて改善する
セッション値の入力時に同じコードが繰り返される場合を改善します.
SessionUser user = (SessionUser) httpSession.getAttribute("user");
4-1) config.authパッケージに@LoginUser宣言を作成する
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target(ElementType.PARAMETER) // 1.
@Retention(RetentionPolicy.RUNTIME)
public @interface LoginUser { // 2.
}
4-2)同じ場所にLoginUserArcgumentResolverを作成する
:メソッドが条件を満たす場合、HandlerMethodArcgumentResolverのインプリメンテーションとして指定する値をメソッドのパラメータ
import lombok.RequiredArgsConstructor;
import org.springframework.core.MethodParameter;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.support.WebDataBinderFactory;
import org.springframework.web.context.request.NativeWebRequest;
import org.springframework.web.method.support.HandlerMethodArgumentResolver;
import org.springframework.web.method.support.ModelAndViewContainer;
import javax.servlet.http.HttpSession;
@RequiredArgsConstructor
@Component
public class LoginUserArgumentResolver
implements HandlerMethodArgumentResolver {
private final HttpSession httpSession;
@Override
public boolean supportsParameter(MethodParameter parameter){ // 1.
boolean isLoginUserAnnotation
= parameter.getParameterAnnotation(LoginUser.class) != null;
boolean isUserClass = SessionUser.class.equals(parameter.getParameterType());
return isLoginUserAnnotation && isUserClass;
}
@Override // 2.
public Object resolveArgument(MethodParameter parameter,
ModelAndViewContainer mavContainer, NativeWebRequest webRequest,
WebDataBinderFactory binderFactory) throws Exception{
return httpSession.getAttribute("user");
}
}
パラメータクラスタイプはSessionUserです.クラスはtrue
4-3)構成パッケージにWebConfigクラスを作成する
import lombok.RequiredArgsConstructor;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.method.support.HandlerMethodArgumentResolver;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import java.util.List;
@RequiredArgsConstructor
@Configuration
public class WebConfig implements WebMvcConfigurer {
private final LoginUserArgumentResolver loginUserArgumentResolver;
@Override
public void addArgumentResolvers(
List<HandlerMethodArgumentResolver> argumentResolvers){
argumentResolvers.add(loginUserArgumentResolver);
}
}
4-4)IndexControllerコードのすべての重複部分を@LoginUserに改良
...
public class IndexController {
private final PostsService postsService;
//private final HttpSession httpSession;
@GetMapping("/")
public String index(Model model, @LoginUser SessionUser user){ // 1. 4.
model.addAttribute("posts", postsService.findAllDesc());
//SessionUser user = (SessionUser) httpSession.getAttribute("user"); // 2.
if(user != null){ // 3.
model.addAttribute("user", user.getName());
}
return "index";
}
...
4-5)ログインが正常に動作していることを確認する
05.セッション・リポジトリとしてデータベースを使用する
現在のサービスでは、セッションが埋め込まれたTomcatのメモリに格納されているため、アプリケーションの再実行はログインを無効にします.
デフォルトでは、セッションはWASを実行するメモリに格納され、呼び出されます.したがって、アプリケーションを実行するときの構造では、埋め込み型Tomcatなどのセッションは常に初期化されます.
=>導入のたびにTomcatが再起動されます.
また、複数のサーバが実行されている場合は、Tomcatごとにセッション同期を設定する必要があります.したがって、実際の「現状」では、セッションストレージには次の3つの選択肢が選択されています.
メモリDB(例えば
メモリDB(
5-1)spring-sessession-jdbcの登録
1. build.gradleへの依存性の登録
compile('org.springframework.session:spring-session-jdbc')
2. application.propertiesでjdbcとしてセッション・リポジトリを選択
spring.session.store-type=jdbc
5-2)テスト登録
アプリケーションテストログインを再実行し、h 2-consoleに接続
SELECT * FROM SPRING_SESSION
Reference
この問題について(Spring SecurityおよびOAuth 2.0を使用したログイン機能(04-05)), 我々は、より多くの情報をここで見つけました https://velog.io/@cutehuman/05-스프링-시큐리티와-OAuth-2.0으로-로그인-기능-구현하기0405テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol