//spring HomeController.java 실행 시 customLogin으로 이동하도록
//com.kb.controller.HomeController.java
@Controller
public class HomeController {
private static final Logger logger = LoggerFactory.getLogger(HomeController.class);
/**
* Simply selects the home view to render by returning its name.
*/
@RequestMapping(value = "/", method = RequestMethod.GET)
public String home(Locale locale, Model model) {
return "/customLogin";
}
//infinity 파일을 학습재료로 삼아 dashboard를 각각 게시판과 멤버관리 페이지로 이동되도록
//webapp/WEB-INF/views/includes/header.jsp
<li class="has-submenu">
<a href="javascript:void(0)" class="submenu-toggle">
<i class="menu-icon zmdi zmdi-view-dashboard zmdi-hc-lg"></i>
<span class="menu-text">Smart JAVA</span>
<i class="menu-caret zmdi zmdi-hc-sm zmdi-chevron-right"></i>
</a>
<ul class="submenu">
<li><a href="/member/list"><span class="menu-text">MemberManage</span></a></li>
<li><a href="/board/list"><span class="menu-text">Board & Gallery</span></a></li>
</ul>
</li>
//로그인한 사람에 따라 보여줄 페이지 바꿔라
//com.kb.security.LoginSuccessHandler.java
package com.kb.security;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.security.authentication.jaas.AuthorityGranter;
import org.springframework.security.core.Authentication;
import org.springframework.security.web.authentication.AuthenticationSuccessHandler;
public class LoginSuccessHandler implements AuthenticationSuccessHandler{
@Override
public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response,
Authentication auth) throws IOException, ServletException {
List<String> roleNames = new ArrayList<String>();
//ROLE_MEMBER, ROLE_ADMIN 배열로 받아오겠다.
auth.getAuthorities().forEach(authority -> {
roleNames.add(authority.getAuthority());
});
if(roleNames.contains("ROLE_ADMIN")) {
response.sendRedirect("/member/list");
return;
}
if(roleNames.contains("ROLE_MEMBER")) {
response.sendRedirect("/member/list");
return;
}
//이도 저도 아니면 Home으로 가서 시간을 보여라
response.sendRedirect("/");
}
}
//header.jsp _ logout
//javascript + jquery
<a class="text-color" onclick="logout_btn();">
<span class="m-r-xs"><i class="fa fa-power-off"></i></span>
<span>Logout</span>
</a>
<form action="/customLogout" method="post" id="logout">
<input type="hidden" name="${_csrf.parameterName }" value="${_csrf.token }"/>
</form>
<script type="text/javascript">
function logout_btn() {
$("#logout").submit();
}
</script>
//jquery
//로그인한 사람의 아이디가 프로필에 등록되도록 변경
webapp/WEB-INF/views/includes/header.jsp
<%@ taglib uri="http://www.springframework.org/security/tags" prefix="sec" %>
//프로필 위치에 로그인한 사람의 아이디 집어넣기
<h5><a href="javascript:void(0)" class="username"><sec:authentication property="principal.member.uname"/></a></h5>
//상황:
<input type="hidden" name="authority" value="ROLE_MEMBER"/>
//member/register 를 통해 등록하던 중 발생
//(1) 누군가는 405가 발생하는 반면, 다른 누군가는 500이 발생하였음.
//(2) 다 똑같은 화면을 보고 같이 따라쳤는데 에러가 다르게 나온다?
//현재 위치: com.kb.service.MemberServiceImpl.java
@Override
@Transactional
public void register(MemberVO member) {
log.info("register");
mapper.insert(member);
authMapper.insert(member.getAuthList().get(0));
}
//현재 위치: com.kb.controller.MemberController.java
@RequestMapping(value = "/register", method = RequestMethod.POST)
public String register(MemberVO member, RedirectAttributes rttr) {
List<AuthorVO> list = new ArrayList<AuthorVO>();
AuthorVO authorvo = new AuthorVO();
authorvo.setUid(member.getUid());
authorvo.setAuthority("ROLE_MEMBER");
//authorvo.setAuthority(member.getAuthList().get(0).getAuthority());
member.setAuthList(list);
list.add(authorvo);
service.register(member);
return "redirect:/member/list";
}
//web.xml
//세션 유지시간 60분으로 설정
<session-config>
<session-timeout>60</session-timeout>
</session-config>
//멤버들에게 권한 추가 및 삭제하기
<table class="table table-hover">
<thead>
<tr><th>#번호</th><th>회원명</th><th>학교명</th><th>학년반</th><th>전화번호</th><th>가입일</th><th>권한관리</th></tr>
</thead>
<c:forEach items="${list}" var="member">
<tr>
<td>${member.num}</td><td>
<a href="get?num=${member.num}">${member.uname}</a></td>
<td>${member.schoolname}</td>
<td>${member.gradeclass}</td>
<td>${member.uid}</td>
<td><fmt:formatDate pattern="yyyy-MM-dd HH:mm:ss" value="${member.joindate}"/></td>
<td><a href="getMemberAuths?uid=${member.uid }">추가 / 삭제</a></td>
</tr>
</c:forEach>
</table>
//MemberController.java
@RequestMapping(value = "/getMemberAuths", method = RequestMethod.POST)
public String readAuthsByUid(@RequestParam("uid") int uid, Model model) {
service.readAuthsByUid(uid);
model.addAttribute("list" ,list);
return "redirect:/member/list";
}
//MemberServiceImpl.java
@Override
public void readAuthsByUid(int uid) {
List<AuthorVO> list = authMapper.readAuthsByUid(uid);
return list;
}
//MemberService.java
public List<AuthorVO> readAuthsByUid(int uid); //추가
//AuthorMapper.xml
<select id="readAuthsById" resultType="com.kb.domain.AuthorVO">
SELECT * FROM tbl_author WHERE uid = #{uid}
</select>
//리스트에서 멤버 권한 주기
//authList.jsp
<table class="table table-hover">
<thead>
<tr><th>#번호</th><th>ID</th><th>권한</th><th>권한관리</th></tr>
</thead>
<c:forEach items="${list}" var="author" varStatus="num">
<tr>
<td>${num.count }</td>
<td>${author.uid }</td>
<td>${author.authority }</td>
<td></td>
</tr>
<!-- <c:set value="${author.uid }" var="uid"></c:set> -->
<%-- <tr>
<td>${member.num}</td><td>
<a href="get?num=${member.num}">${member.uname}</a></td>
<td>${member.schoolname}</td>
<td>${member.gradeclass}</td>
<td>${member.uid}</td>
<td><fmt:formatDate pattern="yyyy-MM-dd HH:mm:ss" value="${member.joindate}"/></td>
<td><a href="getMemberAuths?uid=${member.uid }">추가 / 삭제</a></td>
</tr> --%>
</c:forEach>
</table>
<div class="col-xs-7 pagination">
<form method="post">
<input type="hidden" name="${_csrf.parameterName }" value="${_csrf.token }"/>
<input type="hidden" name="uid" value="${uid }"/>
<select name="type" class="form-control" style="float:left; width:50%; height:32px;">
<option value="">Add authority</option>
<option value="ROLE_ADMIN" >Admin</option>
<option value="Role_MEMBER">Manager</option>
<option value="Role_USER">User</option>
</select>
<button class="btn btn-default btn-sm" style="float:left;">add authority</button>
</form>
</div>
//권한주기(2).java
//Controller.java
@RequestMapping(value = "/getMemberAuths", method = RequestMethod.GET)
public String readAuthsByUid(@RequestParam("uid") String uid, Model model) {
List<AuthorVO> list = service.readAuthsByUid(uid);
model.addAttribute("list", list);
model.addAttribute("uid", uid);
return "/member/authList";
}
@RequestMapping(value = "/getMemberAuths", method = RequestMethod.POST)
public String insertAuthByUid(AuthorVO vo) {
service.insertAuthByUid(vo);
return "redirect:/member/getMemberAuths?uid=" +vo.getUid();
}
//ServiceImpl.java
@Override
public void insertAuthByUid(AuthorVO vo) {
authMapper.insert(vo);
}
//Service.java
public void insertAuthByUid(AuthorVO vo);
//Mapper.java
public List<AuthorVO> readAuthsByUid(String uid);
//Mapper.xml
<insert id="insert">
INSERT INTO tbl_author (uid, authority)
VALUES (#{uid}, #{authority})
</insert>
<select id="readAuthsByUid" resultType="com.kb.domain.AuthorVO">
SELECT * FROM tbl_author WHERE uid = #{uid}
</select>
<delete id="delete">
DELETE FROM tbl_author WHERE bno = #{bno}
</delete>