평범한 연구소

[Spring] 스프링 시큐리티 세션, 권한 활용하기 본문

Spring Framework

[Spring] 스프링 시큐리티 세션, 권한 활용하기

soyeonisgood 2022. 12. 23. 20:38

 

이전에 공부했던 스프링 시큐리티.

스프링 시큐리티의 세션을 활용하여 로그인한 유저의 세션 정보를 가져와보자.

 

2022.12.03 - [Web/Spring Framework] - [Spring] 시큐리티 Security

 

 

[Spring] 시큐리티 Security

Spring Security - 스프링 시큐리티는 Spring(and Spring Boot로 빌드된 애플리케이션) 웹 애플리케이션과 REST API를 보호하기 위해 널리 사용되는 프레임워크. - REST API의 인증과 권한 부여를 제공. DB와 LDAP

jeongsoyeon.tistory.com

 

 

Table - MEMBER

유저 정보 데이터가 저장되는 Member 테이블의 구성이다.

컬럼명을 잘 보자.

 

security-context.xml

관리자 페이지는 ROLE_ADMIN 권한을 가진 관리자만 접근 가능하다.

로그인한 유저의 권한을 가져온다. 

이메일을 아이디로 로그인하므로 email 컬럼의 별명으로 username.

권한 데이터가 담긴 Authority 테이블의 authority 컬럼을 가져온다. 컬럼명이 다르다면 별명으로 authority를 줘야한다.

	...
	<!-- 관리자 페이지 -->
	<intercept-url pattern="/admin" access="hasRole('ROLE_ADMIN')"/>
	<intercept-url pattern="/admin/**" access="hasRole('ROLE_ADMIN')"/>
        
        ...

<jdbc-user-service data-source-ref="dataSource"
    	id="userService"
    	users-by-username-query="SELECT email AS username, pwd AS password, enabled FROM member WHERE email = ?"
    	authorities-by-username-query="SELECT email AS username, authority FROM member m 
			JOIN authority a ON a.memberNo = m.memberNo WHERE email = ?"/>

 

Member.java

유저 DTO 객체인 member 클래스의 변수 항목이다.

여기서 변수명과 앞서 본 컬럼명동일해야한다!

만약 두 개가 다르다면, SELECT문에서 별명으로 변수명을 주어 일치시켜야한다.

public class Member {
	private long memberNo;
	private String email;
	private String email1;
	private String email2;
	private String pwd;
	private String name;
	private String nickName;
	private String birth;
	private String gender;
	private String joinDate;
	private String recentDate; // 최근 방문일
	private int wrongCnt;
	private String profile;
	private String modifyDate; // 비번변경일
	private int memberShip; // 회원 등급
	private int enabled;
	
	private String authority;
    
    ...

memberMapper.xml

	<select id="readMember" parameterType="String" resultType="com.sp.app.member.Member">
		SELECT m.memberNo, email, name, nickName, pwd, TO_CHAR(birth, 'YYYY-MM-DD') birth, 
			gender, modifyDate, recentDate, profile, authority, enabled, memberShip
		FROM member m
		JOIN Authority a ON m.memberNo = a.memberNo
		WHERE email = #{email}
	</select>

 

LoginSuccessHandler.java

security-context.xml에서, 로그인(인증)에 성공하면 해당 핸들러의 함수가 실행된다.

인증 성공 시 실행할 함수에서 세션에 로그인 유저 정보를 저장한다.

@Override
	public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response,
			Authentication authentication) throws ServletException, IOException {

		// 로그인 날짜 변경
		try {
			// authentication.getName() : 로그인 아이디. (이메일)
			service.updateLastLogin(authentication.getName());
		} catch (Exception e) {
		}
		
		// 세션에 로그인 유저 정보 저장
		HttpSession session = request.getSession();
		
		Member member = service.readMember(authentication.getName());
		
		SessionInfo info = new SessionInfo();
		info.setMemberNo(member.getMemberNo());
		info.setEmail(member.getEmail());
		info.setName(member.getName());
		info.setNickName(member.getNickName());
		info.setMemberShip(member.getMemberShip());
		info.setAuthority(member.getAuthority());
		
		session.setAttribute("member", info);
        
        ...