로그인까지 했으니 이제
로그아웃.
계정, 권한 만들기,
admin 페이지를 만들어 보겠다.
1. 로그아웃 하기
우선 로그아웃 기능을 추가한다.
이전에 만든 SecurityConfig 에 내용을 추가한다.
http
.sessionManagement((auth) -> auth
.sessionFixation().changeSessionId() //세션공격 보호
.maximumSessions(1) //세션 최대 개수
.maxSessionsPreventsLogin(false) //다중 로그인 시 처리방법 treu : 신규로그인차단, false : 기존세션삭제
);
http
.logout((auth) -> auth
.logoutRequestMatcher(new AntPathRequestMatcher("/logout"))
.logoutSuccessUrl("/login")
.invalidateHttpSession(true)
.deleteCookies("JSESSIONID"));
로그인 관련 설정 및 /logout 절차 내용이다.
로그아웃 시 /login 페이지로 다시 돌려보낸다.
따로 /logout 을 매핑하지 않아도 security 가 알아서 처리해준다.
2. 권한 만들기
우선 테이블과 모델 클래스를 만든다.
@Data
public class Role {
private String roleId;
private String roleName;
private String description;
}
권한Id, 이름, 설명 객체를 만들고
roleId 는 자동으로 증가하게끔, 나머진 nvarchar 로 대충 (쿼리문 어디간지 모르겠음)
(테이블 role1 로 지음)
@Data
public class RoleUser{
private int userId;
private int roleId;
}
권한과 유저를 매핑할 수 있는 테이블과 객체를 하나 생성
(테이블 role_user1 로 지음)
이후 이 권한을 이용해 게시판에도 내용을 넣을거니 게시판과 권한을 위한 테이블 하나 생성해줌.
@Data
public class Category {
private String categoryId;
private String categoryName;
private String description;
private String roleId;
}
게시판 카테고리 객체 및 테이블을 하나 만들어주고 (테이블 board_category)
CREATE TABLE board_role (
categoryId INT NOT NULL, -- board_category 테이블의 categoryId 컬럼을 참조
roleId INT NOT NULL, -- role1 테이블의 roleId 컬럼을 참조
PRIMARY KEY (categoryId, roleId),
FOREIGN KEY (categoryId) REFERENCES board_category(categoryId), -- board_category 테이블의 categoryId 컬럼을 참조
FOREIGN KEY (roleId) REFERENCES role1(roleId) -- role1 테이블의 roleId 컬럼을 참조
);
위처럼 매핑할 테이블도 하나 만들어주었다.
이후 Role 에 admin 을 위해 미리 데이터 하나 넣어줌.
insert into role1 (role_id, role_name) values (1, 'ROLE_ADMIN');
insert into role_user1 (username, role_id) values ('admin', 1);
이전에 만든 admin 이라는 계정에, ROLE_ADMIN 이라는 권한을 생성해서 그 권한을 부여해주었다.
Spring Security 권한은 기본적으로 ROLE_XXXX 형태로 만들면된다.
3. admin 페이지 작성
어드민 계정 및 권한도 만들었으니 나머지는 이제 이 권한을 사용해서 페이지를 통해 생성해볼 수 있게 만들어본다.
우선 페이지를 만들었는데,
WEB-INF/jsp 아래 admin 이라는 폴더를 하나 더 만들어서 다른 jsp 파일들과 구분을 지을 수 있게끔 만들었다.

그리고 흩어져있는 CSS들을 하나로 관리하기 위해 CSS파일을 하나 만들었다.

main.css 내용
body:nth-of-type(1) {
font-family: Arial, sans-serif;
background-color: #f2f2f2; /* 연한 회색 배경색 적용 */
padding: 20px; /* 바깥쪽 여백 추가 */
}
table {
border-collapse: collapse;
width: 90%;
margin: 20px auto;
}
table, th, td {
border: 1px solid #ccc;
}
th, td {
padding: 8px;
}
th:first-child,
td:first-child {
width: 5%;
}
a {
text-decoration: none;
color: #007bff;
}
a:hover {
text-decoration: underline;
color: #0056b3;
}
main {
display: flex;
flex: 1;
}
nav {
width: 200px;
background-color: #eaeaea;
padding: 10px;
}
section {
flex: 1;
padding: 10px;
}
.index{
display: flex;
justify-content: center;
}
우리 챗GPT 작품