본문 바로가기
Study Hard/HW

[스프링시큐리티] 프로젝트 환경셋팅 및 로그인 진행

by 코플+ 2023. 6. 26.

 

 

프로젝트에 스프링시큐리티 적용하기

 

🖥️ 환경
java 1.8.0_202
IDE : STS3 (3.9.15.RELEASE)
Spring FrameWork 5.3.25

 

https://codeplus.tistory.com/180

 

[스프링Legacy] Spring Security 프로젝트 초기설정 (STS, 이클립스)

스프링 Legacy - Spring MVC 프로젝트 생성 후 프로젝트 설정 1. 프로젝트 설정 1-1) 프로젝트의 Java Build Path 에 Tomcat v8.5 추가 1-2) 프로젝트의 Project Facets 설정 - 버전을 수정해준다. (Java 1.8/ Dynamic Web Modu

codeplus.tistory.com

 

기존에 적었던 내용을 먼저 진행한다.

 

좀 달라진게 있다면 스프링프레임워크의 default DB테이블을 사용하는게 아닌

custom테이블을 사용할거라는거 그럼 몇가지 설정이 필요하다.

 

우선 유저(멤버테이블)과 role 테이블의 물리명이 다르다.

또한 컬럼명도 다르다.

 

이럴 경우 방법은 두가지가 있다. security-context.xml에서 직접 쿼리문 날려주기

두번째 방법은  UserDetailsService를 구현하는 구현하는방식으로 직접 db를 받고 User를 상속받아 아이디와 비밀번호를 프레임워크에 건네줘 구현하는 방식이다.

 

두번째 방식으로 구현해보았다.

 

우선 UserDetailService를 구현해준다.

security-context.xml에  다음을 추가해준다.

<!-- Bean등록 -->
<bean id="customUserDetailsServive" class="team.tttt.webapp.security.CustomUserDetailsService"></bean>

<!-- 유저 서비스 등록-->
	<security:authentication-manager>
		<security:authentication-provider user-service-ref="customUserDetailsServive">
		</security:authentication-provider>
	</security:authentication-manager>

CustomUserDetailsService

public class CustomUserDetailsService implements UserDetailsService{
	@Inject
	private UserMapper userMapper;

	@Override
	public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {

		UserVO user;

		try {
			user = userMapper.read(username);
			return user == null ? null : new CustomUser(user);
		} catch (Exception e) {
			e.printStackTrace();
		}
		return null;
	}
}

mapper를 통해서 id, pw, enabled, role 등을 불러온다.

UserVO 는 다음과같다. 

Role역할을 List로 담아주는것이 포인트다.

 

CustomUser.class

public class CustomUser extends User {

	private UserVO user;

	public CustomUser(String username , String password, Collection<? extends GrantedAuthority> authorities) {
		super(username, password, authorities);
	}

	public CustomUser(UserVO user) {
		super(user.getUserNo(), user.getUserPswd(),
				user.getAuthList().stream().map(auth -> new SimpleGrantedAuthority(auth.getRoleCode())).collect(Collectors.toList()));
		this.user = user;
	}

	public UserVO getMember() {
		return user;
	}

	public void setMember(UserVO user) {
		this.user = user;
	}
}

 

security-context.xml에도 추가설정을 해준다.

        <security:form-login login-page="/user/login"
                           username-parameter="userNo"
                           password-parameter="userPswd"
                           login-processing-url="/login"
                           authentication-success-handler-ref="customLoginSuccess"/>

 - login-page 는 임의의 custom jsp 로그인페이지를 사용하기위함이고

 - username/password 파라미터는 form의 input태그의 name값을 적어주면된다.

 - login-processing-url은 action을 보낼경로이고

 - success핸들러는 로그인성공시 사용할 핸들러를 걸어주면된다.

 

role역할명에 ROLE_ 접두사를 사용하지않는방법은 아래방법을 사용했다.

 

https://codeplus.tistory.com/202

 

[스프링시큐리티] role명에 "ROLE_" 접두사를 꼭 붙여야 하는가? (해결방법)

오늘 하루종일 Spring MVC 프로젝트의 시큐리티를 구현하는데 힘썼다. 그중 3시간은 역할설정할때 role앞에 접두사 "ROLE"이 필수인지, 그리고 수정할수 있는것인지 검색하는데 시간을 보내서 정리해

codeplus.tistory.com

 

댓글