質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

89.97%

Spring SecurityのsessionFixationの設定が反映されない

受付中

回答 0

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 1,572

koronatail

score 420

前提・実現したいこと

Spring Boot+Spring Securityで独自認証処理を実装したのですが、WebSecurityConfigurerAdapterを継承した設定用クラスで設定した内容が反映されませんでした。

試したこと

内容的には以下のURLに乗っている現象と同じだと思ったのですが、principalにあたるDTOにhashCodeとequalsを実装しても現象が変わりませんでした。
http://stackoverflow.com/questions/37090378/custom-authenticationprovider-ignore-sessionmanagement

該当のソースコード

長くなってしまいますが設定クラス・プリンシパル・独自認証処理部分を載せます。

WebSecurityConfig 

sessionManagement().sessionFixation().newSession()の部分が反映されません。
セッションIDが変わらないことを確認しました。
SessionFixationProtectionEventも拾えませんでした。

@Configuration
@EnableWebSecurity 
@EnableGlobalMethodSecurity(prePostEnabled = true, securedEnabled = true)
public class WebSecurityConfig extends WebSecurityConfigurerAdapter  {
    @Autowired
    private AuthenticationProviderImpl authenticationProvider;

    @Override
    protected void configure(final HttpSecurity pHttp) throws Exception {
        pHttp
                .authorizeRequests()
                .antMatchers("/hoge","/fuga").permitAll()
                .anyRequest().fullyAuthenticated()
        .and().formLogin()
                .loginPage("/")
                .loginProcessingUrl("/login") 
                .defaultSuccessUrl("/hogehoge")
                .usernameParameter("id")
                .passwordParameter("pw")
                .failureUrl("/hogefailure").permitAll()
        .and().sessionManagement()//これらの設定が反映されない
                .sessionFixation()//これらの設定が反映されない
                .newSession()//これらの設定が反映されない
        .and().logout()
                .addLogoutHandler(customLogoutHandler())
                .logoutRequestMatcher(new AntPathRequestMatcher("/logout"))
                .logoutSuccessUrl("/hogesuccess")
                .deleteCookies("JSESSIONID")
                .invalidateHttpSession(true).permitAll()
        .and().addFilterBefore(idPassAuthenticationFilter(), UsernamePasswordAuthenticationFilter.class)
        ;
    }


    @Bean
    //Bean色々省略

    @Autowired
    public void configureGlobal(AuthenticationManagerBuilder pAuth) {
        pAuth
                .authenticationProvider(authenticationProvider)
                .authenticationEventPublisher(defaultAuthenticationEventPublisher();
    }
}

LoginInfoDto.java(プリンシパルにあたるもの) 

public class LoginInfoDTO extends User {
    private int userId;
    private String loginId;
    private String password;
    private String name;
    private LocalDateTime currentLoginTime;
    private String locationCd;
    private String locationGrpCd;

  //ゲッターセッター省略

    @Override
    public int hashCode() {
        final int prime = 31;
        int result = super.hashCode();
        result = prime * result + ((currentLoginTime == null) ? 0 : currentLoginTime.hashCode());
        result = prime * result + ((locationCd == null) ? 0 : locationCd.hashCode());
        result = prime * result + ((locationGrpCd == null) ? 0 : locationGrpCd.hashCode());
        result = prime * result + ((loginId == null) ? 0 : loginId.hashCode());
        result = prime * result + ((name == null) ? 0 : name.hashCode());
        result = prime * result + ((password == null) ? 0 : password.hashCode());
        result = prime * result + userId;
        return result;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (!super.equals(obj))
            return false;
        if (getClass() != obj.getClass())
            return false;
        LoginInfoDTO other = (LoginInfoDTO) obj;
        if (currentLoginTime == null) {
            if (other.currentLoginTime != null)
                return false;
        } else if (!currentLoginTime.equals(other.currentLoginTime))
            return false;
        if (locationCd == null) {
            if (other.locationCd != null)
                return false;
        } else if (!locationCd.equals(other.locationCd))
            return false;
        if (locationGrpCd == null) {
            if (other.locationGrpCd != null)
                return false;
        } else if (!locationGrpCd.equals(other.locationGrpCd))
            return false;
        if (loginId == null) {
            if (other.loginId != null)
                return false;
        } else if (!loginId.equals(other.loginId))
            return false;
        if (name == null) {
            if (other.name != null)
                return false;
        } else if (!name.equals(other.name))
            return false;
        if (password == null) {
            if (other.password != null)
                return false;
        } else if (!password.equals(other.password))
            return false;
        if (userId != other.userId)
            return false;
        return true;
    }

}

AuthenticationProviderImpl.java

@Component
public class AuthenticationProviderImpl implements AuthenticationProvider {
    @Autowired
    private UserMstDao userMstDao;

    /**
     * 独自認証処理.
     */
    @Override
    public Authentication authenticate(final Authentication pAuth){

        try {
           //独自認証処理省略
            return new UsernamePasswordAuthenticationToken(new LoginInfoDTO(user), 
                    inputPassword.getString(), pAuth.getAuthorities());
        } catch (AuthenticationCredentialsNotFoundException pE) {

            pE.printStackTrace();
            throw pE;
        }
    }
    @Override
    public boolean supports(final Class<?> pToken) {

        return UsernamePasswordAuthenticationToken.class.isAssignableFrom(pToken);
    }

    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + ((userMstDao == null) ? 0 : userMstDao.hashCode());
        return result;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        AuthenticationProviderImpl other = (AuthenticationProviderImpl) obj;
        if (userMstDao == null) {
            if (other.userMstDao != null)
                return false;
        } else if (!userMstDao.equals(other.userMstDao))
            return false;
        return true;
    }
}

補足情報(言語/FW/ツール等のバージョンなど)

Spring Bootのバージョンは1.3.6になります

長くなってしまいましたがどうかよろしくお願いします。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

まだ回答がついていません

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 89.97%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる