minlog
article thumbnail

 

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>

 

profile

minlog

@jimin-log

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!