DeseoDeSeo
[Spring] (보안2)내 정보 수정에서 권한 수정하기 & 회원가입 시, 비밀번호암호 본문
ミ★
코드 추가후. 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>
'spring' 카테고리의 다른 글
[Spring] mvc04, 로그인 modal메세지 (0) | 2023.09.26 |
---|---|
[Spring] (보안1)db의 회원 비밀번호 보안 설정하기 (0) | 2023.09.25 |
[Spring] MVC004 실습 세팅 (0) | 2023.09.21 |
[Spring] 해당 글 작성자만 수정, 삭제 가능 기능 (0) | 2023.09.21 |
[Spring] 파일 업로드 및 프로필 사진 출력하기 (0) | 2023.09.20 |