1. 권한을 설정하는 데이터테이블 및 객체 생성
📑 board.sql
- 회원테이블
create table mem_stbl(
memIdx int not null, -- 자동증가X
memID varchar(20) not null,
memPassword varchar(20) not null,
memName varchar(20) not null,
memAge int,
memGender varchar(20),
memEmail varchar(50),
memProfile varchar(50),
primary key(memID)
);
1) memIdx - 최대값에 + 1 이 증가되게 추가해줄 예정.
2) memPassword - 보완으로 넘어가면 텍스트가 길어질 수 있어 20으로 설정
- 회원 인증 테이블
create table mem_auth(
no int not null auto_increment,
memID varchar(50) not null,
auth varchar(50) not null,
primary key(no),
constraint fk_member_auth foreign key(memID)
references mem_stbl(memID)
);
3) auth : 권한 정보 한명의 회원이 권한이 여러개일 수 있다.
2. 권한을 추가한 객체 생성
📑 Member.java
@Data
public class Member {
...
private List<AuthVO> authList;
}
1) 기존 멤버 객체에게 권한에 대한 변수가 필요하다.
권한을 한사람이 여러개 받을 수 있다. List 배열로 설정하여 여러 권한을 권한관리하는 객체(AuthVo)에게 값을 넘겨준다.
authList[0].auth, authList[1].auth, authList[2].auth
📑 AuthVO.java
public class AuthVO {
private int no; // 일련번호
private String memID; //회원 아이디
private String auth; // 회원권한
}
2) 권한을 관리하는 객체가 필요
- 객체의 고유 번호
- 멤버객체와 연결되는 회원아이디
- 회원권한
3. 회원가입시 권한 저장
📑 join.jsp
-html
<tr>
<td style="width: 110px; vertical-align: middle;">사용자 권한</td>
<td colspan="2">
<input type="checkbox" name="authList[0].auth" value="ROLE_USER"> ROLE_USER
<input type="checkbox" name="authList[1].auth" value="ROLE_MANAGER"> ROLE_MANAGER
<input type="checkbox" name="authList[2].auth" value="ROLE_ADMIN"> ROLE_ADMIN
</td>
</tr>
1 ) JSP 화면에 사용자 권한을 설정 할수 있는 체크박스 추가
📑 MemberMapper.xml
<insert id="register" parameterType="kr.board.entity.Member">
insert into
mem_stbl(memIdx,memID,memPassword,memName,memAge,memGender,memEmail,memProfile)
values((select IFNULL(MAX(memIdx)+1,1) from mem_stbl mem) ,
#{memID},#{memPassword},#{memName},#{memAge},#{memGender},#{memEmail},#{memProfile})
</insert>
2) 기존테이블에서 권한 관리 테이블로 SQL문 변경.
- idx :값을 자동으로 받는 것이 아니라 하나씩 증가시켜주는 방식 : IFNULL 만약 값이 없으면 1, 아니면 최대값 + 1
📑 MemberController.java
// 회원가입 처리
@RequestMapping("/memRegister.do")
public String memRegister(Member m, String memPassword1, String memPassword2,
RedirectAttributes rttr, HttpSession session) {
...
// register() 수정
int result=memberMapper.register(m);
if(result==1) { // 회원가입 성공 메세지
// 추가 : 권한테이블에 회원의 권한을 저장하기
List<AuthVO> list=m.getAuthList();
for(AuthVO authVO : list) {
if(authVO.getAuth()!=null) {
AuthVO saveVO=new AuthVO();
saveVO.setMemID(m.getMemID()); //회원아이디
saveVO.setAuth(authVO.getAuth()); //회원의권한
memberMapper.authInsert(saveVO);
}
}
...
}
...
}
1) 회원가입시 데이터베이스에 권한 테이블도 함께 저장이 되어야한다.
- 권한테이블에는 사용자 이름과 권한 정보가 필요
- 멤버객체에는 권한의 정보를 가지고 오려면 List에 들어있는 authVo의 값을 가져와야한다 (향상된 for문)
- 선택 했던 값이 null이 아니라면,
<insert id="authInsert" parameterType="kr.board.entity.AuthVO">
INSERT INTO mem_auth(memID, auth) values(#{memID}, #{auth})
</insert>
4. DB 고객 정보를 가져와서 사용하기
고객의 정보를 가져올때, 이제 권한의 정보도 함께 가져오려면 데이터베이스의 테이블을 join해야한다.
📑 MemberMapper.xml
<resultMap type="kr.board.entity.Member" id="memberMap">
<id property="memIdx" column="memIdx"/>
<result property="memID" column="memID"/>
<result property="memPassword" column="memPassword"/>
<result property="memName" column="memName"/>
<result property="memAge" column="memAge"/>
<result property="memGender" column="memGender"/>
<result property="memEmail" column="memEmail"/>
<result property="memProfile" column="memProfile"/>
<collection property="authList" resultMap="authMap">
</collection>
</resultMap>
<resultMap type="kr.board.entity.AuthVO" id="authMap">
<id property="no" column="no"/>
<result property="memID" column="memID"/>
<result property="auth" column="auth"/>
</resultMap>
1) 데이터베이스 테이블 join시 으로 테이블을 묶어서 명시가 필요하다.
<select id="getMember" resultMap="memberMap">
select * from mem_stbl mem LEFT OUTER JOIN mem_auth auth on
mem.memID=auth.memID where mem.memID=#{memID}
</select>
2) 두개의 테이블을 JOIN 하여 정보를 가져온다.
📑 memUpdateForm.jsp
<tr>
<td style="width: 110px; vertical-align: middle;">사용자 권한</td>
<td colspan="2">
<input type="checkbox" name="authList[0].auth" value="ROLE_USER"
<c:forEach var="authVO" items="${mvo.authList}">
<c:if test="${authVO.auth eq 'ROLE_USER'}">
checked
</c:if>
</c:forEach>
/> ROLE_USER
<input type="checkbox" name="authList[1].auth" value="ROLE_MANAGER"
<c:forEach var="authVO" items="${mvo.authList}">
<c:if test="${authVO.auth eq 'ROLE_MANAGER'}">
checked
</c:if>
</c:forEach>
/> ROLE_MANAGER
<input type="checkbox" name="authList[2].auth" value="ROLE_ADMIN"
<c:forEach var="authVO" items="${mvo.authList}">
<c:if test="${authVO.auth eq 'ROLE_ADMIN'}">
checked
</c:if>
</c:forEach>
/> ROLE_ADMIN
</td>
</tr>
3) 정보 수정하기
- 사용자 권한 수정시 기존권한을 다 삭제하고 새롭게 추가해준다.
📑 MemberController.java
// 회원정보수정
@RequestMapping("/memUpdate.do")
public String memUpdate(Member m, RedirectAttributes rttr,
String memPassword1, String memPassword2, HttpSession session) {
...
// 회원을 수정저장하기
// 추가 : 비밀번호 암호화
String encyptPw=pwEncoder.encode(m.getMemPassword());
m.setMemPassword(encyptPw);
int result=memberMapper.memUpdate(m);
if(result==1) { // 수정성공 메세지
// 기존권한을 삭제하고
memberMapper.authDelete(m.getMemID());
// 새로운 권한을 추가하기
List<AuthVO> list=m.getAuthList();
for(AuthVO authVO : list) {
if(authVO.getAuth()!=null) {
AuthVO saveVO=new AuthVO();
saveVO.setMemID(m.getMemID());
saveVO.setAuth(authVO.getAuth());
memberMapper.authInsert(saveVO);
}
}
...
return "redirect:/";
}else {
...
return "redirect:/memUpdateForm.do";
}
}
📑 MemberMapper.xml
<update id="memUpdate" parameterType="kr.board.entity.Member">
update mem_stbl set memPassword=#{memPassword}, memName=#{memName},
memAge=#{memAge},memGender=#{memGender},memEmail=#{memEmail}
where memID=#{memID}
</update>
'BackEnd > Spring Boot' 카테고리의 다른 글
[ Spring ] Ioc/Aop 의존관계 주입 개념 (0) | 2023.03.07 |
---|---|
[ Spirng ] Security - java (4) Spring-Security를 사용한 암호화 (0) | 2023.03.06 |
[ Spring ] Security - java (2) 비밀번호 암호화하기 (0) | 2023.03.05 |
[ Spring ] Security - java (1) 기반의 보안 환경설정과 사용방법 (0) | 2023.03.05 |
[ Spring ] JAVA 기반의 환경설정 방법 (0) | 2023.03.04 |