728x90
롬복
setter, getter, toString 생성자를 자동으로 생성해주는 라이브러리
다운로드 후 cmd창을 열고
cd 다운받은경로
java -jar lombok.jar
설치 창이 뜨면 스프링 선택 -> install
스프링 경로에 C:\sts-bundle\sts-3.9.18.RELEASE 폴더 안에 lombok.jar 파일 있으면 설치 완료
pom.xml lombok 설치
- https://mvnrepository.com/ 에서 lombok 검색
- project lombok 아무거나 복사한 후 pom.xml에 붙여넣기
- 버전을 1.18.32로 변경(lombok 다운받은 버전이 1.18.32이기 때문에)
<!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.32</version>
<scope>provided</scope>
</dependency>
lombok을 사용 가능하게 됨
lombok 관련 어노테이션
@Setter
@Getter
@ToString
@Data
@AllArgsConstructor //생성자
@Builder //빌더형태로 변경
@Value
MemberDTO, AutoDTO에 멤버변수만 남겨두고 나머지 다 지움 -> 관련된 파일에서 에러가 발생함
@Setter, @Getter, @ToString 어노테이션을 붙여주면 에러가 없어짐
package com.itwillbs.domain;
import java.sql.Timestamp;
import java.util.List;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
@Setter
@Getter
@ToString
public class MemberDTO {
private String userid;
private String userpw;
private String username;
private Timestamp regdate;
private Timestamp updatedate;
private String enable;
private List<AuthDTO> authList;
}
package com.itwillbs.domain;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
@Setter
@Getter
@ToString
public class AuthDTO {
private String userid;
private String auth;
}
회원가입이 동작되는지 확인
customInsert()
customInsert()
MemberDTO(userid=asdf, userpw=1234, username=테스트, regdate=null, updatedate=null, enabled=null, authList=null)
SampleService insertMember()
SampleDAO insertMember()
MemberDTO(userid=asdf, userpw=$2a$10$tS8dnQM27FvJs8EeesraduLoQYp30F4X/2CRlfDTfqOcLrWzL2a1y, username=테스트, regdate=2024-04-04 09:37:57.711, updatedate=2024-04-04 09:37:57.711, enabled=null, authList=null)
SampleDAO inserMemberAuth()
AuthDTO(userid=asdf, auth=ROLE_MEMBER)
doCustomLogin()
error : null
logout : null
태그 라이브러리 security 적용
태그라이브러리를 이용해서 security 적용
security-context
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:security="http://www.springframework.org/schema/security"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security.xsd">
<!-- authentication-manager 인증매니저
<= provider manager
<= 이용 authentication-provider : 인증작업
<= UserdetailService : 인증된 정보에 권한에 대한 정보를 같이 전달
: 사용자의 정보와 사용자가 가진 권한의 정보를 처리해서 반환
UserdetailService(CachingUserDetailService, InMemoryUserDetailsManager,JdbcDaoImpl, JdbcUserDetailsManager,
LdapUserDetailsManager, LdapUserDetailsService 클래스 제공)
JDBC
1) 지정된 형식 테이블 생성
create table users(
username varchar(50) not null primary key,
password varchar(50) not null,
enabled char(1) default '1');
create table authorities (
username varchar(50) not null,
authority varchar(50) not null,
constraint fk_authorities_users foreign key(username) references users(username));
create unique index ix_auth_username on authorities (username,authority);
insert into users (username, password) values ('user00','pw00');
insert into users (username, password) values ('member00','pw00');
insert into users (username, password) values ('admin00','pw00');
insert into authorities (username, authority) values ('user00','ROLE_USER');
insert into authorities (username, authority) values ('member00','ROLE_MANAGER');
insert into authorities (username, authority) values ('member00','ROLE_MEMBER');
insert into authorities (username, authority) values ('admin00','ROLE_MEMBER');
insert into authorities (username, authority) values ('admin00','ROLE_MANAGER');
insert into authorities (username, authority) values ('admin00','ROLE_ADMIN');
2) 기존 데이터베이스 이용
-->
<bean id="customAccessDenied"
class="com.itwillbs.security.CustomAccessDeniedHandler"></bean>
<bean id="customLoginSuccess"
class="com.itwillbs.security.CustomLoginSuccessHandler"></bean>
<bean id="customUserDetailsService"
class="com.itwillbs.security.CustomUserDetailsService"></bean>
<!-- 인증 X -->
<!-- <bean id="CustomNoOpPasswordEncoder" -->
<!-- class="com.itwillbs.security.CustomNoOpPasswordEncoder"></bean> -->
<!-- 인증 O -->
<bean id="bcryptPasswordEncoder"
class="org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder"></bean>
<security:http>
<security:intercept-url pattern="/sample/all"
access="permitAll" />
<security:intercept-url
pattern="/sample/member" access="hasRole('ROLE_MEMBER')" />
<security:intercept-url pattern="/sample/admin"
access="hasRole('ROLE_ADMIN')" />
<!-- http://localhost:8080/secu/login -->
<!-- <security:form-login/> -->
<security:form-login
login-page="/sample/customLogin"
authentication-success-handler-ref="customLoginSuccess" />
<security:logout logout-url="/sample/customLogout"
invalidate-session="true" />
<!-- HTTP 상태 403 – 금지됨 => 페이지 연결 -->
<!-- <security:access-denied-handler error-page="/sample/accessError"/> -->
<security:access-denied-handler
ref="customAccessDenied" />
<!-- csrf 토큰 : 서버에 세션에 저장, 브라우저에 전송 된 csrf 토큰 검사하는 방식 csrf 토큰 생성을 비활성화,
쿠키를 이용해서 처리 -->
<!-- <security:csrf disabled="true"/> -->
</security:http>
<security:authentication-manager>
<security:authentication-provider>
<!-- <security:authentication-provider -->
<!-- user-service-ref="customUserDetailsService"> -->
<!-- <security:user-service> There is no PasswordEncoder mapped for the
id "null" noop : PasswordEncoder 없이 사용 <security:user name="member" password="{noop}member"
authorities="ROLE_MEMBER"/> <security:user name="admin" password="{noop}admin"
authorities="ROLE_MEMBER, ROLE_ADMIN"/> </security:user-service> -->
<!-- <security:jdbc-user-service data-source-ref="dataSource"/> -->
<!-- <security:password-encoder ref="CustomNoOpPasswordEncoder"/> -->
<security:jdbc-user-service
data-source-ref="dataSource"
users-by-username-query="select userid, userpw, enabled from tbl_member where userid = ?"
authorities-by-username-query="select userid, auth from tbl_member_auth where userid = ?" />
<security:password-encoder
ref="bcryptPasswordEncoder" />
</security:authentication-provider>
</security:authentication-manager>
</beans>
관리자로 로그인
권한 정보를 보이기
admin.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="sec" uri="http://www.springframework.org/security/tags" %> <!-- 보안 관련 태그 라이브러리 -->
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>sample/admin.jsp</title>
</head>
<body>
<h1>sample/admin.jsp</h1>
<h1>로그인 한 사용자 중에서 관리자 권한을 가진 사용자 접근 가능</h1>
<a href="${pageContext.request.contextPath}/sample/customLogout">로그아웃</a><br>
<h2>principal : <sec:authentication property="principal"/></h2>
</body>
</html>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="sec" uri="http://www.springframework.org/security/tags" %> <!-- 보안 관련 태그 라이브러리 -->
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>sample/admin.jsp</title>
</head>
<body>
<h1>sample/admin.jsp</h1>
<h1>로그인 한 사용자 중에서 관리자 권한을 가진 사용자 접근 가능</h1>
<a href="${pageContext.request.contextPath}/sample/customLogout">로그아웃</a><br>
<h2>principal : <sec:authentication property="principal"/></h2>
<h2>사용자 아이디 : <sec:authentication property="principal.username"/> </h2>
</body>
</html>
all.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="sec" uri="http://www.springframework.org/security/tags" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>sample/all.jsp</title>
</head>
<body>
<h1>sample/all.jsp</h1>
<h1>모든 사용자 접근 가능</h1>
<!-- 스프링 시큐리티 표현식
hasRole(권한)이 있으면 ture
hasAuthority(권한)이 있으면 true
hasAnyRole(권한, 권한) 여러 권한 중에 권한이 있으면 true
hasAnyAuthority(권한, 권한) 여러 권한 중에 권한이 있으면 true
principal : 현재 사용자 정보를 의미
permitAll : 모든 사용자에게 허용
denyAll : 모든 사용자 거부
isAnonymous() 익명의 사용자일 경우
isAuthenticated() 인증된 사용자면 true
isFullyAuthenticated() Remember-me(로그인 정보 기억)로 인증된 것이 아닌 인증된 사용자인 경우 true
-->
<!-- 익명의 사용자의 경우 로그인 페이지로 이동 -->
<sec:authorize access="isAnonymous()">
<a href="${pageContext.request.contextPath }/sample/customLogin">로그인</a>
</sec:authorize>
<br>
<sec:authorize access="isAuthenticated()">
<h2>사용자 아이디 : <sec:authentication property="principal.username"/> </h2>
<a href="${pageContext.request.contextPath }/sample/customLogout">로그아웃</a>
</sec:authorize>
</body>
</html>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="sec" uri="http://www.springframework.org/security/tags" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>sample/all.jsp</title>
</head>
<body>
<h1>sample/all.jsp</h1>
<h1>모든 사용자 접근 가능</h1>
<!-- 스프링 시큐리티 표현식
hasRole(권한)이 있으면 ture
hasAuthority(권한)이 있으면 true
hasAnyRole(권한, 권한) 여러 권한 중에 권한이 있으면 true
hasAnyAuthority(권한, 권한) 여러 권한 중에 권한이 있으면 true
principal : 현재 사용자 정보를 의미
permitAll : 모든 사용자에게 허용
denyAll : 모든 사용자 거부
isAnonymous() 익명의 사용자일 경우
isAuthenticated() 인증된 사용자면 true
isFullyAuthenticated() Remember-me(로그인 정보 기억)로 인증된 것이 아닌 인증된 사용자인 경우 true
-->
<!-- 익명의 사용자의 경우 로그인 페이지로 이동 -->
<sec:authorize access="isAnonymous()">
<a href="${pageContext.request.contextPath }/sample/customLogin">로그인</a>
</sec:authorize>
<br>
<sec:authentication property="principal" var="memid"/>
<sec:authorize access="isAuthenticated()">
<!-- 글수정, 글삭제 버튼이 보이게 조건을 넣어 줄 수 있다. -->
<c:if test="${memid.username eq 'admin'}">
<h2>관리자 아이디 : <sec:authentication property="principal.username"/> </h2>
<a href="${pageContext.request.contextPath}/sample/customLogout">관리자 로그아웃</a>
</c:if>
<c:if test="${!(memid.username eq 'admin')}">
<%-- == <c:if test="${memid.username ne 'admin'}"> --%>
<h2>사용자 아이디 : <sec:authentication property="principal.username"/></h2>
<a href="${pageContext.request.contextPath}/sample/customLogout">로그아웃</a>
</c:if>
</sec:authorize>
</body>
</html>
728x90
'KDT > WEB' 카테고리의 다른 글
240408 Web - TourWeb 2 (0) | 2024.04.08 |
---|---|
240405 WEB - TourWeb 1 (0) | 2024.04.05 |
WEB - 테스트 1, 롬복 1 (0) | 2024.04.03 |
240328 Web - 보안 6 (0) | 2024.03.28 |
240326 WEB - 보안 5 (0) | 2024.03.26 |