관리 메뉴

ふたりで

springboot + security tags를 사용한 menu권한 처리 및 수동 인증(강제로그인). 본문

Spring

springboot + security tags를 사용한 menu권한 처리 및 수동 인증(강제로그인).

graykang 2021. 12. 28. 13:53
728x90
반응형
SMALL

1. Maven 설정.

		<dependency>
		    <groupId>org.springframework.security</groupId>
		    <artifactId>spring-security-taglibs</artifactId>
		</dependency>

2. security tags를 사용할 화면 title 테그쯤(위치는 알아서...)에 링크소스 적용.

<%@ taglib prefix="sec" uri="http://www.springframework.org/security/tags" %>

 

3. jsp 소스에서 권한 처리.

${prc.authorities}에 인증 받은 사용자가 소유한 여러 권한이 들어있고, 나의 경우 추가로 ${prc.categoryMenu}를 

CustomUserDetailsImpl 객체에 List<>형으로 더추가해 보았다.

(음...${prc.categoryMenu}는 화면에서 공통으로 처리해야 하는 카테고리 리스트를 담아서 사용해 볼까 한다.)

<sec:authentication property="principal" var="prc"/>
<c:forEach items="${prc.authorities  }" var="auth">
${auth }
</c:forEach>
<c:forEach items="${prc.categoryMenu  }" var="menu">
${menu.catName }
</c:forEach>

3. 참고: CustomUserDetailsImpl.java 소스

import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.authority.SimpleGrantedAuthority;
import org.springframework.security.core.userdetails.UserDetails;

import com.graykang.front.model.CategoryListVO;

@SuppressWarnings("serial")
public class CustomUserDetailsImpl implements UserDetails{
	
	private String userId;
	private String userPassword;
	private List<GrantedAuthority> userRole;
	private int userStatus;
	//인증정보에 포함될 추가정보.
	private String userBizno;
	private int userCode;
	private String userBizname;
	private List<CategoryListVO> categoryMenu; 
	
	@Override
	public Collection<? extends GrantedAuthority> getAuthorities() {
        ArrayList<GrantedAuthority> auth = new ArrayList<GrantedAuthority>();
        /* 
         * 
         * userRole을 외부에서 List<GrantedAuthority> 타입으로 주입해서 사용하기위해 수정
         * 외부(gateway)에서 주입받는 걸 그대로 GrantedAuthoritydp 주입한다.
         * 기본 인증 로직으로 처리 할시 userRole을 String 형으로 변경후
         * 아래 auth.add() 부분의 주석을 풀고 auth객체를 return 해준다.
         *  
         */
        //auth.add(new SimpleGrantedAuthority(userRole));
        return userRole;
	}
	
	@Override
	public String getPassword() {
		// TODO Auto-generated method stub
		return userPassword;
	}
	@Override
	public String getUsername() {
		// TODO Auto-generated method stub
		return userId;
	}
	//인증 우회를 위해 추가함.
	public void setUsername(String userId) {
		this.userId = userId;
	}
	@Override
	public boolean isAccountNonExpired() {
		// TODO Auto-generated method stub
		return true;
	}
	@Override
	public boolean isAccountNonLocked() {
		// TODO Auto-generated method stub
		return true;
	}
	@Override
	public boolean isCredentialsNonExpired() {
		// TODO Auto-generated method stub
		return true;
	}
	@Override
	public boolean isEnabled() {
		// TODO Auto-generated method stub
		boolean status = false;
		if(userStatus == 1) {
			status = true;
		}
		
		return status;
	}

	public String getUserBizno() {
		return userBizno;
	}

	public void setUserBizno(String userBizno) {
		this.userBizno = userBizno;
	}

	public int getUserCode() {
		return userCode;
	}

	public void setUserCode(int userCode) {
		this.userCode = userCode;
	}

	public String getUserBizname() {
		return userBizname;
	}

	public void setUserBizname(String userBizname) {
		this.userBizname = userBizname;
	}
	//인증우회?(자동인증)를 위해 추가함.
	public List<GrantedAuthority> getUserRole() {
		return userRole;
	}
	//인증우회?(자동인증)를 위해 추가함.
	public void setUserRole(List<GrantedAuthority> roles) {
		this.userRole = roles;
	}
    //별도로 카테고리 메뉴를 추가.
	public List<CategoryListVO> getCategoryMenu() {
		return categoryMenu;
	}
    //별도로 카테고리 메뉴를 추가.
	public void setCategoryMenu(List<CategoryListVO> categoryMenu) {
		this.categoryMenu = categoryMenu;
	}
	

}

4. 참고: 수동 인증처리 소스

아래 소스는 보안 처리 부분이 빠져있다. 가끔 실무에서 비정상적인 루트로 인증 처리를 해주어야 하는경우

참고...특정 인가된 정보를 가진 접근만 세션을 수동으로 만들어 주면 오깨~

@RequestMapping(value = "/frontAuth", method= {RequestMethod.GET, RequestMethod.POST})
public String loginWithoutForm(Model model
, HttpServletRequest request) {

        List<GrantedAuthority> roles = new ArrayList<>();
        CustomUserDetailsImpl user = new CustomUserDetailsImpl();

        //수동으로 메뉴권한 설정.
        roles.add(new SimpleGrantedAuthority("ROLE_USER"));
        roles.add(new SimpleGrantedAuthority("menuA"));
        roles.add(new SimpleGrantedAuthority("menuB"));
        roles.add(new SimpleGrantedAuthority("menuC"));
        roles.add(new SimpleGrantedAuthority("menuD"));
        roles.add(new SimpleGrantedAuthority("menuE"));
        roles.add(new SimpleGrantedAuthority("menuF"));

        user.setUserBizname("graykangBiz");
        user.setUsername("graykang");
        user.setUserBizno("1234567890");

        //수동으로 설정한 권한 set
        user.setUserRole(roles);

        //카테고리 메뉴를 DB에서 조회하여 set
        user.setCategoryMenu(frontService.getCategoryList(params));
        //설정된 사용자 정보로 세션생성.
        Authentication auth = new UsernamePasswordAuthenticationToken(user,null,roles);
        SecurityContextHolder.getContext().setAuthentication(auth);

	return "redirect:/front/dashBoard";
}
728x90
반응형
LIST
Comments