스프링 보안 컨텍스트에 저장된 기본 개체에 추가 세부 정보 추가
Spring 3.0과 Spring Security 3을 사용하고 있습니다.Spring Security를 사용하여 데이터베이스에 대해 사용자를 인증할 수 있습니다.사용:
SecurityContextHolder.getContext().getAuthentication().getPrincipal()
현재 로그인한 사용자의 사용자 이름을 검색할 수 있습니다.Spring Security 컨텍스트에 저장된 주 객체에 사용자 ID 및 모듈 액세스와 같은 추가 세부 정보를 추가하여 나중에 검색할 수 있도록 하고 싶습니다.주 개체에 추가 세부 정보를 추가하고 나중에 jsp 또는 java 클래스에서 검색하려면 어떻게 해야 합니까?가능한 경우 적절한 코드 조각을 제공하십시오.
편집: JDBC를 사용하여 데이터베이스에 액세스하고 있습니다.
필요한 것은 다음과 같습니다.
- 스프링 연장
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);
}
}
스프링 보안 컨텍스트 구성
@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
또는 속성을 설정합니다.
인증된 사용자에게 더 많은 세부 정보를 추가합니다.먼저 스프링 보안 사용자 개체를 확장해야 하는 사용자 개체의 자체 구현을 만들어야 합니다.그런 다음 인증된 사용자에게 추가할 속성을 추가할 수 있습니다.이 작업이 완료되면 사용자 개체의 구현을 반환해야 합니다.UserDetailService
(인증에 LDAP를 사용하지 않는 경우).이 링크는 인증된 사용자에게 추가 세부 정보를 제공합니다.
http://javahotpot.blogspot.com/2013/12/spring-security-adding-more-information.html
(기본적인 스프링 보안 구성이 작동하고 기본 구성 요소가 함께 작동하는 방식을 알고 있다고 가정합니다.)
가장 "올바른" 방법은 사용자 정의 구현을 반환하는 의 구현을 제공하는 것입니다.그러면 이걸 작성해주시면 됩니다.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>
의 사용자 지정 구현을 제공하면 작동할 수 있지만, 그렇게 하는 것이 덜 깨끗한 접근 방식일 것이라고 생각합니다.
사용자 세부사항 개체의 구현을 반환하는 사용자 고유의 UserDetailsService 구현을 만드는 것이 "단순한" 작업입니다.
JPA 기반을 구현하는 튜토리얼은 여기를 참조하십시오.UserDetailsService
.
언급URL : https://stackoverflow.com/questions/20349594/adding-additional-details-to-principal-object-stored-in-spring-security-context
'source' 카테고리의 다른 글
Oracle regexp의 불균형한 '^' 및 '$' 앵커 (0) | 2023.08.09 |
---|---|
쉼표로 구분된 std:: 문자열 구문 분석 (0) | 2023.08.09 |
IIS 대신 Cassini를 사용하면 어떤 장점이 있습니까? (0) | 2023.08.09 |
ASP.NET MVC에서 레이저 @Url을 사용하려면 어떻게 해야 합니까?C# 코드의 내용() 도우미? (0) | 2023.08.09 |
텍스트 파일의 내용을 파워셸의 정규식으로 바꾸기 (0) | 2023.08.09 |