さて、前回の続きです。
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かな。。
コメント