관리 메뉴

DeseoDeSeo

[Spring] (보안2)내 정보 수정에서 권한 수정하기 & 회원가입 시, 비밀번호암호 본문

spring

[Spring] (보안2)내 정보 수정에서 권한 수정하기 & 회원가입 시, 비밀번호암호

deseodeseo 2023. 9. 25. 15:01

ミ★  

      코드 추가후. 404 에러 나면 xml의 sql문에 문제 있음.
      사진 관련 500에러 나면 resources > upload파일에 파일 아무거나 저장해놓기.

       or 

      이 경로에서 resource폴더 안에 upload파일이 없을 수도 있음.

joinForm.jsp
<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>

 

MemberController > " join.do "
@RequestMapping("/join.do")
	public String join(Member m, RedirectAttributes rttr, HttpSession session) {
		System.out.println("회원가입 기능요청");
		
		//유효성 검사
		if(m.getMemID() ==null || m.getMemID().equals("")|| m.getMemPassword()==null || m.getMemPassword().equals("")||
				m.getMemName()==null || m.getMemName().equals("")|| m.getMemAge() ==0 || m.getMemEmail() == null ||
				m.getMemEmail().equals("")||m.getAuthList().size()==0) {
			//회원 가입을 할 수 없다 하나라도 누락되어 있기 때문에
			
			//실패시 joinForm.do로 msgType과 msg내용을 보내야함.
			rttr.addFlashAttribute("msgType", "실패메세지");
			rttr.addFlashAttribute("msg", "모든 내용을 입력하세요.");
			return "redirect:/joinForm.do";
			//redirect방식에서는 model에 데이터 저장 불가.
			//forward방식에서만 model에 데이터저장 가능.
			//RedirectAttributes - 리다이렉트 방식으로 이동할 때 보낼 데이터를 저장하는 객체 
		}else {
			//회원 가입 가능

			//null값 대신 넣으려구.
			m.setMemProfile("");
			//비밀번호 암호화 !!!!!!!!!!!!!!요기서 
			String encyPw = pwEncoder.encode(m.getMemPassword());
			m.setMemPassword(encyPw);

			
			int cnt = mapper.join(m);
			//회원가입 후 index.jsp로 이동시키시오.
			// 추가 : 권한 테이블에 회원의 권한을 저장하기 (09/25 월)
			//m은 회원가입할 때 정보들임. 
			List<Auth> list = m.getAuthList();
			//권한을 여러개 선택할 수 있으니가 list로 받아옴. ?!
			for(Auth auth : list) {
				//Auth형태로 받아올거임.
				if(auth.getAuth() != null) {
					//가져온 권한 값이 있을 때만 권한테이블에 값 넣기
					Auth saveVO = new Auth();
					saveVO.setMemID(m.getMemID()); // 회원 아이디 넣기
					saveVO.setAuth(auth.getAuth()); //권한 넣기
					//권한 저장
					mapper.authInsert(saveVO);
					
				}
			}
SecurityConfig.java
(security Config 클래스 내)
➜ 회원가입 기능 마무리 하기 전에 비밀번호를 암호화하여서 값을 집어넣음.
     패스워드를 암호화하는 기능을 객체로 만들어 컨테이너에 넣음.
	@Bean
	//패스워드 인코딩 기능을 메모리에 올리는 작업
    // 패스워드 인코딩 객체 설정
	public PasswordEncoder passwordEncoder() {
       // 비밀번호 암호화 메서드
		return new BCryptPasswordEncoder();
	}
Member Controller.java
➜ 생성해놓은 비밀번호 암호화 객체를 주입받아 사용함.
@Autowired 
private PasswordEncoder pwEncoder;
MemberController.java
}else {
			//회원 가입 가능

			//null값 대신 넣으려구.
			m.setMemProfile("");
			//비밀번호 암호화 !!!!!!!!!!!!!!
			String encyPw = pwEncoder.encode(m.getMemPassword());
			m.setMemPassword(encyPw);
            int cnt = mapper.join(m);
BoardMapper.xml
<insert id ="join" parameterType="kr.spring.entity.Member">
	INSERT INTO MEMBER(MEMIDX, MEMID, MEMPASSWORD,MEMNAME,MEMAGE,MEMGENDER,MEMEMAIL,MEMPROFILE) 
	VALUES((SELECT IFNULL(MAX(MEMIDX)+1, 1)FROM MEMBER MEM),
	#{memID},#{memPassword},#{memName},#{memAge},#{memGender},#{memEmail},#{memProfile})
</insert>
join.do > else
List<Auth> list = m.getAuthList();
//권한을 여러개 선택할 수 있으니가 list로 받아옴. ?!
	for(Auth auth : list) {
		//Auth형태로 받아올거임.
		if(auth.getAuth() != null) {
			//가져온 권한 값이 있을 때만 권한테이블에 값 넣기
			Auth saveVO = new Auth();
			saveVO.setMemID(m.getMemID()); // 회원 아이디 넣기
			saveVO.setAuth(auth.getAuth()); //권한 넣기
            //권한 저장
			mapper.authInsert(saveVO);
}
MemberMapper.java
	public void authInsert(Auth saveVO);
MemberMapper.xml
<insert id="authInsert" parameterType="kr.spring.entity.Auth">
	INSERT INTO AUTH(MEMID, AUTH) VALUES(#{memID}, #{auth})
</insert>
join.do 
if(cnt==1) {
		System.out.println("회원가입 성공");
		rttr.addFlashAttribute("msgType", "성공메세지");
		rttr.addFlashAttribute("msg", "회원가입에 성공했습니다.");
		//회원가입 성공 시 로그인 처리까지 시키기
			
		// 회원가입 성공 시 회원정보 + 권한정보까지 가져오기
		Member mvo = mapper.getMember(m.getMemID());	
		session.setAttribute("mvo", mvo);
		//mvo라는 이름으로 m을 넣겠다.
		//성공시 main으로 이동함,
			return "redirect:/";
}else {
		System.out.println("회원가입 실패.");
		rttr.addFlashAttribute("msgType", "실패메세지");
		rttr.addFlashAttribute("msg", "회원가입에 실패했습니다.");
		return "redirect:/joinForm.do" ;
		}
}

권한 정보 가져오기 

권한 테이블에 회원 권한 저장하기 !
MemberMapper.xml
<select id="getMember" parameterType="String" resultMap="memberMap">
	SELECT * FROM MEMBER mem LEFT OUTER JOIN Auth auth on  <!-- MEMBER를 mem. AUTH를 auth라고 함.,  -->
	mem.MEMID = auth.MEMID WHERE mem.MEMID=#{memID}
</select>

○ resultType : select문의 조회 결과를 담는 그릇의 타입 

○ resultMap : 여러개의 컬럼을 조회할떄.

                      - 쿼리 조회 결과를 여러 자바 객체를 담을 때( 1: 多 관계)에 사용.

                      - 하나의 결과에 부가적으로 여러 개의 데이터를 처리하는 경우, 1:多의 결과를 처리가능.

                      - resultType과는 다르게 xml내에서 선언해서 사용하는 매퍼.  ( 별도로 사용자 정의한 타입으로 매핑 가능)

                    ❑  id태그 : 기본키 일 때(primary key)

                    ❑  result 태그 : 기본 키가 아닐 때

                    ❑ association태그: sql에서 join할 때 (1:1 매칭)

                     ❑ collection태그: sql에서 join할 때 (1:多 매칭)

<resultMap type="kr.spring.entity.Auth" id="authMap">
	 	<id property="no" column="no" />                    <!-- auth의 primary key  -->
		<result property="memID" column ="memID" />         <!--    -->
		<result property="auth" column="auth" />            <!--  -->
	</resultMap>
	
<resultMap type="kr.spring.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이라 표현 -->
	<collection property="authList" resultMap="authMap"/>
</resultMap>
	
<insert id="authInsert" parameterType="kr.spring.entity.Auth">
	INSERT INTO AUTH(MEMID, AUTH) VALUES(#{memID}, #{auth})
</insert>
MemberMapper.xml

 

<select id ="getMember" parameterType ="kr.spring.entity.Member" resultMap="memberMap" >
		SELECT * FROM MEMBER mem LEFT OUTER JOIN Auth auth on  <!-- MEMBER를 mem. AUTH를 auth라고 함.,  -->
		mem.MEMID = auth.MEMID WHERE mem.MEMID=#{memID} 
</select>
header.jsp
 <c:if test="${not empty mvo}">
      <ul class="nav navbar-nav navbar-right">
                <li>
                <c:if test="${mvo.memProfile ne ''}">
                	<img class="img-circle"style="width:50px; height:50px;"src="${contextPath}/resources/upload/${mvo.memProfile}">    
                </c:if>
                  <c:if test="${mvo.memProfile eq ''}">
                	<img class="img-circle"style="width:50px; height:50px;"src="${contextPath}/resources/images/default.jpg">
                </c:if>
                ${mvo.memName}님 welcome.     
                [
                	<!-- 권한 정보 띄우기 -->
                	<!-- 회원이 가진 권한의 리스트만큼 반복돌면서 꺼내기 -->
                	<c:forEach items="${mvo.authList}" var="auth">
                		<c:choose>
                			<c:when test="${auth.auth eq 'ROLE_USER'}">
                				U
                			</c:when>
                			<c:when test="${auth.auth eq 'ROLE_MANAGER'}">
                				M
                			</c:when>
                			<c:when test="${auth.auth eq 'ROLE_ADMIN'}">
                				A
                			</c:when>
                			
                			
                		</c:choose>
                	</c:forEach>
                
                ]

이렇게 설정하면 상단에 권한도 같이 출력된다.

현재 DB에 저장되어있는 회원 비밀번호가 암호화 되어있기 때문에
입력한 pw가 암호화된 pw와 일치하는지 확인 해야한다.
" login.do "
: 아이디가 일치하면 회원을 값을 가져와서 pwEncoder를 활용해서 복호화한 pw와 입력한 pw가 일치하는지 확인!
일치하면 세션에 값을 넣어준다.
@RequestMapping("/Login.do")
	public String login(RedirectAttributes rttr,  Member m, HttpSession session) {
		//문제
		// mapper에 login이라는 메소드 이름으로 로그인 기능을 수행하시오.
		// 로그인 성공 시 -> index.jsp 이동 후, 로그인에 성공했습니다 modal창 띄우기
		// 로그인 실패 시 -> login.jsp 이동 후, 로그인에 실패했습니다 modal 창 띄우기
		Member mvo =mapper.login(m);
		//mvo는 실패하면 null이 들어감.
		//mvo가 실패하지 않는다면 
		  // 추가 비밀번호 일치여부 체크
		if(mvo != null && pwEncoder.matches(m.getMemPassword(), mvo.getMemPassword())  ) {

				//답을 가져와서 matches가 일치한지 알려줌. true, false로 알려줌.
				rttr.addFlashAttribute("msgType", "성공메세지");
				rttr.addFlashAttribute("msg", "로그인에 성공했습니다.");
				session.setAttribute("mvo", mvo);
				return "redirect:/";
			
		}else {
			rttr.addFlashAttribute("msgType", "실패메세지");
			rttr.addFlashAttribute("msg", "로그인에 실패했습니다.");
			return "redirect:/loginForm.do";
		}
		
	}

 

updateForm.jsp
<!-- 가지고 있는 권한 체크 및 수정 부분  -->
<tr>
	<td style="width:110px; vertical-align:middle;">사용자권한</td>
	<td colspan="2">
	<input value= "ROLE_USER" name="authList[0].auth"type="checkbox" 
		<c:forEach items="${mvo.authList}" var="auth">
		    <c:if test="${auth.auth eq 'ROLE_USER' }">
				checked
			</c:if>
		</c:forEach>
						 			
		 /> ROLE_USER
	<input value= "ROLE_MANAGER" name="authList[1].auth"type="checkbox" 
		<c:forEach items="${mvo.authList}" var="auth">
		    <c:if test="${auth.auth eq 'ROLE_MANAGER' }">
					checked
			</c:if>
		</c:forEach>		 		
	/> ROLE_MANAGER 
	<input value= "ROLE_ADMIN" name="authList[2].auth"type="checkbox" 
		<c:forEach items="${mvo.authList}" var="auth">
		    <c:if test="${auth.auth eq 'ROLE_ADMIN' }">
				checked
			</c:if>
		</c:forEach>					 		
	/> ROLE_ADMIN 
	 	</td>
</tr>

 

update.do > else
}else {
					Member mvo = (Member)session.getAttribute("mvo");
					m.setMemProfile(mvo.getMemProfile());
					//비밀번호 암호화
					String encyPw = pwEncoder.encode(mvo.getMemProfile());
					m.setMemPassword(encyPw);
					
					//권한 삭제
					mapper.authDelete(m.getMemID());
					//권한 입력
					List<Auth> list = m.getAuthList();
					//권한을 여러개 선택할 수 있으니가 list로 받아옴. ?!
					for(Auth auth : list) {
						//Auth형태로 받아올거임.
						if(auth.getAuth() != null) {
							//가져온 권한 값이 있을 때만 권한테이블에 값 넣기
							Auth saveVO = new Auth();
							saveVO.setMemID(m.getMemID()); // 회원 아이디 넣기
							saveVO.setAuth(auth.getAuth()); //권한 넣기
							//권한 저장
							mapper.authInsert(saveVO);
						}
					}
MemberMapper.java
public void authDelete(String memID);
MemberMapper.xml
<delete id="authDelete" parameterType="String">
	DELETE FROM AUTH WHERE MEMID = #{memID}
</delete>