SpringSecurityでお手軽ユーザー認証、その2

Java

さて、前回の続きです。

SpringSecurityの初期サンプルではユーザー認証をXMLに定義していましたが
それだとユーザーの新規登録や変更に対応できないのでDBを使って処理します。

方法はいくつかあって、簡単なのは
authentication-providerのuser-service-ref定義で
org.springframework.security.core.userdetails.jdbc.JdbcDaoImpl
を指定します。

ただこの場合はusersとauthoritiesというテーブルが必要です。
同パッケージ内にDDL文があるのでそれで作成しましょう。

テーブルを独自に定義したい場合はクエリをXML定義に追加して書き換えることは可能です。

<authentication-provider user-service-ref="userDetailsService">
<bean id="userDetailsService"   class="org.springframework.security.core.userdetails.jdbc.JdbcDaoImpl">
    <property name="usersByUsernameQuery" value="select username,password,enabled from users where username = ?" />
    <property name="authoritiesByUsernameQuery" value="select username,authority from authorities where username = ?" />
    <property name="groupAuthoritiesByUsernameQuery" value="select g.id, g.group_name, ga.authority from groups g, group_members gm, group_authorities ga where gm.username = ? and g.id = ga.group_id and g.id = gm.group_id" />
    <property name="dataSource" ref="dataSource"/>

SQLを直書きするのはちょっとという方やORマッパーを使いたいという方はUserDetailsServiceを実装しましょう。
UserDetailsインタフェースを実装したモデルクラスを返却するloadUserByUsernameというメソッドを実装するだけです。

public class DaoUserDetailsServiceImpl implements UserDetailsService {
    // UserService
    // LoginIDをキーにDAOからUser情報を取得するサービスクラス
    @Autowired
    private UserService userService;
    @Override
    public UserDetails loadUserByUsername(String paramString) throws UsernameNotFoundException {
        UserBean userBean = userService.getUserBean(paramString);
        if (userBean == null) {
            throw new UsernameNotFoundException("login_id:" + paramString);
        }
    User user = this.createUserDetails(userBean);
        return user;
    }
    private User createUserDetails(UserBean userBean) {
        List<GrantedAuthority> grantedAuthorities = new ArrayList<GrantedAuthority>();
        for (MstRole mstRole : userBean.getRoles()) {
            // 認可情報は複数(USER_ROLE、USER_ADMINなど)
            GrantedAuthority authority = new SimpleGrantedAuthority(mstRole.getAuthority());
            grantedAuthorities.add(authority);
        }
        boolean accountNonExpired = this.isNonExpired(userBean.getExpire());
        boolean accountNonLocked = this.isNonLocked(userBean.getLockExpire());
        boolean credentialsNonExpired = true;
        User user = new User(userBean.getLoginId(), userBean.getPassword(), userBean.getEnabled(), accountNonExpired,
                             credentialsNonExpired, accountNonLocked, grantedAuthorities);
        return user;
   }
}

サンプルなので、だいたいのイメージで感じとってください(笑)

あとはbean定義してuser-service-refにセットするだけです。
ついでにパスワードをSHA256で暗号化する設定も入れてます。
saltはモデルクラスのusername(ログインIDがセットされます)を指定してます。

<authentication-manager alias="authenticationManager" xmlns="http://www.springframework.org/schema/security">
    <authentication-provider user-service-ref="userDetailsService">
        <password-encoder hash="sha-256">
            <salt-source user-property="username" />
        </password-encoder>
    </authentication-provider>
</authentication-manager>

あと必要な設定というとaccessDecisionManagerかな。。

コメント

タイトルとURLをコピーしました