반응형
Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- node.js
- mybatis
- console
- javascript
- rocky9
- NextJS
- PM2
- submit
- git
- spring3
- yona
- popup
- ajax
- centos7
- Java
- nodejs
- security
- Next.js
- post
- jquery
- MariaDB
- mysql
- Eclipse
- spring
- jenkins
- docker
- SpringBoot
- config
- Maven
- MSsql
Archives
- Today
- Total
ふたりで
springboot + security tags를 사용한 menu권한 처리 및 수동 인증(강제로그인). 본문
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
'Spring' 카테고리의 다른 글
springboot+swagger+config (0) | 2022.04.18 |
---|---|
spring(springboot) simple POST request (API call) (0) | 2022.03.15 |
springboot+sitemesh 설정. (0) | 2021.12.20 |
JWT 토큰 유효기간 설정. (0) | 2021.10.29 |
springboot starting WARN o.a.t.util.scan.StandardJarScanner - Failed to scan java.io.FileNotFoundException "*.jar" (0) | 2021.10.15 |
Comments