- Spring-security-3.1.0.RC2로 작업.
- 일반적인 Spring 설정은 제외.

web.xml
	
	
		contextConfigLocation
		
			 classpath*:/applicationContext*.xml
		
	
...
...
	
		springSecurityFilterChain
		org.springframework.web.filter.DelegatingFilterProxy
	

	
		springSecurityFilterChain
		/*
	


applicationContext-security.xml



	
	

	
		
		
     	
		
        
		
		
		
		
		
		
		
		
		
		
        
		
		
	
	
		
	
	
	
	
	

	
	
	
	

	
		
        	
	

	
		
		
	

	
		
		
	

	
		
		
		
	
	


MemberManager.java
public interface MemberManager extends UserDetailsService{
	// 구현하고픈 메서드
}

MemberManagerImpl.java
@Service("memberMgr")
public class MemberManagerImpl extends AbstractGenericManager implements MemberManager{

	@Autowired
	// DB와 통신할 DAO
	MemberDao memberDao;
	
	@Override
	// 로그인 메서드
	public Member login(String memberId, String memberPw){
		Member member = (Member) loadUserByUsername(memberId);
		if(member != null){
			if(memberPw.equals(member.getPasswd())) {
				member.setName(member.getAuth().get(0).getAuthority());
				member.setAuthenticated(true);
				return member;
			}
		}
		return null;
	}
		
	@Override
	// UserDetailService 구현체
	public UserDetails loadUserByUsername(String adminId) throws UsernameNotFoundException {
		// Parameters는 커스텀 클래스임.
		Parameters params = new Parameters();
		params.put("p_id", adminId);
		List list = null;
		try{
			// DAO를 통해 쿼리를 날리고 결과를 받아오는 것.
			list = memberDao.list(params);
			// 유저가 없을경우.
			if(list.size() == 0 || list.size() > 1){
				return null;
			}
		}catch(Exception e){
			StringBuilder logMsg = (new StringBuilder("Username(")).append(adminId).append(") access exception!");
			logger.error(logMsg.toString(), e);
            throw new UsernameNotFoundException(logMsg.toString(), e);
		}
		return list.get(0);
	}
	
	
	public Collection getAuthorities(Member member) {
		List authList = new ArrayList();
		Role role = member.getRole();
		authList.add(new SimpleGrantedAuthority(role.getRoleName()));
        return authList;
	}

}

Member와 SecurityObject (인증을 저장하고 있을 JPA Entity)
인증 정보를 가지고 있을 객체는 몇가지 객체를 구현해야하는데 이에 필요한 filed가 존재해야만 한다.
JPA에서는 @Entity가 붙은 클래스는 DB와 동기화를 하기 때문에 DB에 없는 filed를 넣을시 에러가 난다.
때문에 SecurityObject를 만들어서 객체 구현에 필요한 filed를 가지게하고
인증 정보를 가지고 있을 객체가 SecurityObject를 상속하는 방식으로 처리 했다.

SecurityObject.java
public class SecurityObject implements Serializable{

	private static final long serialVersionUID = 8359426924640562032L;
	
	protected boolean accountNonExpired;
	protected boolean accountNonLocked;
	protected boolean credentialsNonExpired;
	protected boolean accepted;
	
	protected String name;
	protected Object credentials;
	protected Object details;
	protected Object principal;
	protected boolean authenticated;

}


인증 정보를 가지고 있을 Member 객체
/**
 * The persistent class for the members database table.
 * 
 */
@Entity
@Table(name="members")
public class Member extends com.score.www.common.domain.SecurityObject implements Serializable, UserDetails, Authentication {
	private static final long serialVersionUID = 1L;

	// 이런 저런 filed, ex) name, id, nickname 등

	//bi-directional many-to-one association to Role
	// ROLE과 Member 는 1:N의 관계로 설정했고 이를 JPA로 구현한 것.
	@ManyToOne
	@JoinColumn(name="ROLE_SEQ")
	private Role role;

	public Member() {
	}

	// 일반 filed의 getter/setter

	public Role getRole() {
		return this.role;
	}

	public void setRole(Role role) {
		this.role = role;
	}
	
	@Override
	public Object getCredentials() {
		return credentials;
	}

	@Override
	public Object getDetails() {
		return details;
	}

	@Override
	public Object getPrincipal() {
		return principal;
	}
	
	public void setPrincipal(Object principal){
		this.principal = principal;
	}

	@Override
	public boolean isAuthenticated() {
		return authenticated;
	}

	@Override
	public void setAuthenticated(boolean isAuthenticated) throws IllegalArgumentException {
		this.authenticated = isAuthenticated;
	}

	@SuppressWarnings("unchecked")
	public List getAuth(){
		return (List) this.getAuthorities();
	}
	
	@Override
	public Collection getAuthorities() {
		List list = new ArrayList();
		list.add(new SimpleGrantedAuthority(role.getRoleName()));
		return list;
	}

	@Override
	public String getPassword() {
		return this.passwd;
	}

	@Override
	public String getUsername() {
		return this.memberName;
	}

	@Override
	public boolean isAccountNonExpired() {
		return accountNonExpired;
	}

	@Override
	public boolean isAccountNonLocked() {
		return accountNonLocked;
	}

	@Override
	public boolean isCredentialsNonExpired() {
		return credentialsNonExpired;
	}

	@Override
	public boolean isEnabled() {
		return super.accepted;
	}

	@Override
	public String getName() {
		return this.name;
	}

	public void setName(String authority) {
		this.name = authority;
	}
	
}


 

'백엔드 > Spring' 카테고리의 다른 글

Spring 3.2.3 + myBatis 3.2.2  (0) 2013.07.19
Spring Framework 3.2.3 Maven으로 한번에 추가하기..  (0) 2013.07.18
Spring 3.2.2 + Tiles 3.0  (0) 2013.05.22
Spring Security 설정.  (2) 2011.08.30
[2011-05-26] Spring Security 설정 오류.  (0) 2011.05.26
MySQL AutoReconnect 설정.  (0) 2010.07.12
  1. 개발자 2014.09.30 10:54 신고

    이해와 연결이 잘 안되는 부분이 있는데 질문 드려도 될까요?
    MemberManagerImpl 에서 login 메소드는 어디서 호출이 되는건가요??
    Spring의 UserDetailsService 에는 없는 메소드인데, authenticationManager에 설정했다고 해도 이 메소드가 어떻게 호출이 되고 어떻게 로그인 처리가 되는지 잘 이해가 안되네요...
    설명좀 부탁드려도 될까요?
    그리고 AbstractGenericManager 이 녀석도 제가 갖고 있는 라이브러리 (Spring Security 3.2.4) 에는 안나오던데, 이건 어디에 포함된 클래스인가요?

    • jYeory 2015.04.08 14:01 신고

      회사에서 티스토리 접근이 안돼서 이제 봤네요.
      2011년에 사용했던 코드는 원래 사용하는 방법에서 많이 가다듬어 사용한 거라 문서에 없는 것도 몇 개 있습니다.
      현재는 유지보수 쉽게 문서에 있는 그대로 사용하고 있구요.
      늦게나마 댓글 답니다.

Spring Security 3.1.0.RC2는 최소 Spring 3.0.5 and Java 5가 무조건 필요하다.
Spring Security 3..0.5 는 최소 Spring 3.0.3 and Java 5가 무조건 필요하다. 

위 두개를 간과하고 설정하다가 하루종일 삽질만 해댔다. 
 
sec 버전은 3.1인데 프로젝트 Spring 버전은 3.0.2 requirement 조차 맞추지 못하고 급하게 시작한 결과는 삽질. 




필요 버전으로 업데이트 하고 다시 설정하니 오류가 안난다. 

'백엔드 > Spring' 카테고리의 다른 글

Spring 3.2.3 + myBatis 3.2.2  (0) 2013.07.19
Spring Framework 3.2.3 Maven으로 한번에 추가하기..  (0) 2013.07.18
Spring 3.2.2 + Tiles 3.0  (0) 2013.05.22
Spring Security 설정.  (2) 2011.08.30
[2011-05-26] Spring Security 설정 오류.  (0) 2011.05.26
MySQL AutoReconnect 설정.  (0) 2010.07.12

+ Recent posts