現在、Springのセッション情報をjson形式でredisに格納するための対応を行っております。
config設定を行い、redisへのセッション情報の格納までは確認できましたが、
その後、セッションがredis上に存在している状態で再度アクセスを行うとエラーが発生してしまいます。
ログイン認証時にUsernamePasswordAuthenticationTokenのprincipalには
org.springframework.security.core.userdetails.Userを拡張した、
LoginUserクラスを格納しております。
それが認証後の処理にて再度、UsernamePasswordAuthenticationTokenが実行され、
principalが拡張元のUserクラスで上書きされているのまでは確認できたのですが、
何故、上書きが起こるのかが理解できていない状況です。
確認したいのは以下2点です。
ご教示頂ければ幸いです。
1.UsernamePasswordAuthenticationTokenが再実行されてしまう理由
2.configの設定不備の有無
####エラーログ
java.lang.ClassCastException: org.springframework.security.core.userdetails.User cannot be cast to jp.remacle.config.security.LoginUser
#####エラー発生箇所実装
return (LoginUser)SecurityContextHolder.getContext().getAuthentication().getPrincipal();
HttpSessionConfig
1@Configuration 2public class HttpSessionConfig implements BeanClassLoaderAware { 3 4 private ClassLoader classLoader; 5 6 @Override 7 public void setBeanClassLoader(ClassLoader classLoader) { 8 // TODO 自動生成されたメソッド・スタブ 9 this.classLoader = classLoader; 10 } 11 12 @Bean 13 public RedisSerializer<Object> springSessionDefaultRedisSerializer() { 14 ObjectMapper objectMapper = objectMapper(); 15 objectMapper.addMixIn(LoginUser.class,LoginUserMixin.class); 16 objectMapper.registerModules(SecurityJackson2Modules.getModules(classLoader)); // Spring Securityの拡張モジュールの適用 17 return new GenericJackson2JsonRedisSerializer(objectMapper); // Spring Data RedisにJSON変換用のコンポーネントを適用 18 } 19 20 @Bean 21 public ObjectMapper objectMapper() { 22 ObjectMapper mapper = new ObjectMapper(); 23 mapper.registerModule(new CoreJackson2Module()); 24 return mapper; 25 } 26}
LoginUser
1public class LoginUser extends User { 2 3 private static final long serialVersionUID = 1L; 4 5 @Getter 6 @Setter 7 private String userAddreses; 8 9 public LoginUser(String username, String password, Collection<? extends GrantedAuthority> authorities) { 10 super(username, password, authorities); 11 }
あなたの回答
tips
プレビュー