Spring 3.0およびSpring Security 3を使用しています。SpringSecurityを使用して、データベースに対してユーザーを認証できます。を使用して:
SecurityContextHolder.getContext().getAuthentication().getPrincipal()
現在ログインしているユーザーのユーザー名を取得できます。後で取得できるように、ユーザーIDやモジュールがSpring Securityコンテキストに格納されているプリンシパルオブジェクトにアクセスするなどの詳細を追加したいと思います。プリンシパルオブジェクトに詳細を追加する方法と、jspまたはJavaクラスで後で取得する方法。できれば適切なコードスニペットを指定してください。
編集:JDBCを使用してデータベースにアクセスしています。
前もって感謝します。
認証済みユーザーに詳細を追加するため。最初に、スプリングセキュリティユーザーオブジェクトを拡張するユーザーオブジェクトの独自の実装を作成する必要があります。その後、認証済みユーザーに追加するプロパティを追加できます。これが完了したら、UserDetailServiceでユーザーオブジェクトの実装を返す必要があります(認証にLDAPを使用していない場合)。このリンクは、認証済みユーザーに詳細を追加するための詳細を提供します。
http://javahotpot.blogspot.in/2013/12/spring-security-adding-more-information.html
必要なものは次のとおりです。
User
(org.springframework.security.core.userdetails.User
)クラスと必要なプロパティを拡張します。UserDetailsService
(org.springframework.security.core.userdetails.UserDetailsService
)を拡張し、上記のオブジェクトを埋めます。 loadUserByUsername
をオーバーライドし、拡張ユーザークラスを返しますUserDetailsService
にカスタムAuthenticationManagerBuilder
を設定します例えば
public class CurrentUser extends User{
//This constructor is a must
public CurrentUser(String username, String password, boolean enabled, boolean accountNonExpired,
boolean credentialsNonExpired, boolean accountNonLocked,
Collection<? extends GrantedAuthority> authorities) {
super(username, password, enabled, accountNonExpired, credentialsNonExpired, accountNonLocked, authorities);
}
//Setter and getters are required
private String firstName;
private String lastName;
}
カスタムユーザーの詳細は次のとおりです。
@Service("userDetailsService")
public class CustomUserDetailsService implements UserDetailsService {
@Override
public UserDetails loadUserByUsername(final String username) throws UsernameNotFoundException {
//Try to find user and its roles, for example here we try to get it from database via a DAO object
//Do not confuse this foo.bar.User with CurrentUser or spring User, this is a temporary object which holds user info stored in database
foo.bar.User user = userDao.findByUserName(username);
//Build user Authority. some how a convert from your custom roles which are in database to spring GrantedAuthority
List<GrantedAuthority> authorities = buildUserAuthority(user.getUserRole());
//The magic is happen in this private method !
return buildUserForAuthentication(user, authorities);
}
//Fill your extended User object (CurrentUser) here and return it
private User buildUserForAuthentication(foo.bar.User user,
List<GrantedAuthority> authorities) {
String username = user.getUsername();
String password = user.getPassword();
boolean enabled = true;
boolean accountNonExpired = true;
boolean credentialsNonExpired = true;
boolean accountNonLocked = true;
return new CurrentUser(username, password, enabled, accountNonExpired, credentialsNonExpired,
accountNonLocked, authorities);
//If your database has more information of user for example firstname,... You can fill it here
//CurrentUser currentUser = new CurrentUser(....)
//currentUser.setFirstName( user.getfirstName() );
//.....
//return currentUser ;
}
private List<GrantedAuthority> buildUserAuthority(Set<UserRole> userRoles) {
Set<GrantedAuthority> setAuths = new HashSet<GrantedAuthority>();
// Build user's authorities
for (UserRole userRole : userRoles) {
setAuths.add(new SimpleGrantedAuthority(userRole.getRole()));
}
return new ArrayList<GrantedAuthority>(setAuths);
}
}
Springセキュリティコンテキストを構成する
@Configuration
@EnableWebSecurity
@PropertySource("classpath://configs.properties")
public class SecurityContextConfig extends WebSecurityConfigurerAdapter {
@Autowired
@Qualifier("userDetailsService")
private UserDetailsService userDetailsService;
@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
auth.userDetailsService(userDetailsService);
}
すべて完了です!
(CurrentUser)getAuthentication().getPrincipal()
を呼び出して、新しくCurrentUser
を取得するか、いくつかのプロパティを設定できます。
(基本的なSpring Security構成が機能し、基本的なコンポーネントがどのように連携するかを知っていると仮定します)
最も「正しい」方法は、カスタムの AuthenticationProvider
実装を返す Authentication
の独自の実装を提供することです。次に、このAuthentication
インスタンスに必要なものをすべて入力できます。例えば:
public class MyAuthentication extends UsernamePasswordAuthenticationToken implements Authentication {
public MyAuthentication(Object principal, Object credentials, int moduleCode) {
super(principal, credentials);
this.moduleCode = moduleCode;
}
public MyAuthentication(Object principal, Object credentials, Collection<? extends GrantedAuthority> authorities,int moduleCode) {
super(principal, credentials, authorities);
this.moduleCode = moduleCode;
}
private int moduleCode;
public getModuleCode() {
return moduleCode;
}
}
public class MyAuthenticationProvider extends DaoAuthenticationProvider {
private Collection<GrantedAuthority> obtainAuthorities(UserDetails user) {
// return granted authorities for user, according to your requirements
}
private int obtainModuleCode(UserDetails user) {
// return moduleCode for user, according to your requirements
}
@Override
public Authentication createSuccessAuthentication(Object principal, Authentication authentication, UserDetails user) {
// Suppose this user implementation has a moduleCode property
MyAuthentication result = new MyAuthentication(authentication.getPrincipal(),
authentication.getCredentials(),
obtainAuthorities(user),
obtainModuleCode(user));
result.setDetails(authentication.getDetails());
return result;
}
}
そして、applicationContext.xml
:
<authentication-manager>
<authentication-provider ref="myAuthenticationProvider">
</authentication-manager>
<bean id="myAuthenticationProvider" class="MyAuthenticationProvider" scope="singleton">
...
</bean>
AuthenticationDetails
および AuthenticationDetailsSource
のカスタム実装を提供することで動作させることができると思いますが、それはあまりクリーンなアプローチではないと思います。
行う必要がある「唯一の」ことは、独自の serDetailsService 実装を作成することです。これは、 serDetails オブジェクトの独自の実装を返します。
JPAベースのUserDetailsService
を実装するチュートリアルについては、 here を参照してください。