2015년 8월 3일 월요일

신입SW인력을 위한 실전 자바(Java) 스프링(Spring) 동영상과정 25~27 Security

이 게시물은
http://www.wiz.center/255
http://www.wiz.center/256
http://www.wiz.center/257

해당 링크를 청취하고 작성한 글입니다.

본인 이해도 확인을 위해서 작성한 것이니
스프링에 대해서 알고 있다면 쑥 훝어보고 끝내시고

좀 깊게 알고 싶다면 위의 링크부터 시작해서
총 30개 강의로 이루어진 스프링 과정을 청취하세요

1. 보안 관련 환경 설정 방법
-------------------------------
예제 1
작성1 pom.xml 에 다음 의존을 추가(보안관련) 꽤 많은데...
         다음 내용을 추가


 org.springframework.security
 spring-security-config
 3.2.5.RELEASE



 org.springframework.security
 spring-security-core
 3.2.5.RELEASE



 org.springframework.security
 spring-security-web
 3.2.5.RELEASE



 org.springframework.security
 spring-security-taglibs
 3.2.4.RELEASE



작성2. security-context.xml 라는 설정 파일을 servlet-context 폴더에
         작성하고 아래와 같이 작성한다.
         여기에서는 user를 직접 명시하고 있음(db를 접속하지 않고 진행)
 작성할때 new - Spring bean Configuration 파일 선택이 가능
        -> 파일명 작성 -> 사용할 bean 종류를 선택 (security 선택 가능)
        -> security 선택시 버전별로 선택가능
        -> 완료



 
  
  
 



작성3 web.xml에 설정 추가


  contextConfigLocation
  
   /WEB-INF/spring/root-context.xml
   /WEB-INF/spring/appServlet/security-context.xml
   
 
......


결과 )  security를 사용하기 위한 설정 끝


----------------------------------------------------------

2. 인 메모리형태로 로그인 보안 설정 방법
-------------------------------
예제 계속 진행

작성1 web.xml 에 fillter 추가



      
        springSecurityFilterChain
        org.springframework.web.filter.DelegatingFilterProxy
    
    
        springSecurityFilterChain
        /*
    


작성2 security-context.xml 에 아래 내용을 추가



 
  
  
 
 
 
  
   
    
    
   
  
 



작성3 Controller.java 작성

package com.javalec.spring_security_pjt;

import java.text.DateFormat;
import java.util.Date;
import java.util.Locale;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

/**
 * Handles requests for the application home page.
 */
@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 = "/index.html", method = RequestMethod.GET)
 public String home(Locale locale, Model model) {
  logger.info("Welcome home! The client locale is {}.", locale);
  
  Date date = new Date();
  DateFormat dateFormat = DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG, locale);
  
  String formattedDate = dateFormat.format(date);
  
  model.addAttribute("serverTime", formattedDate );
  
  return "home";
 }
 
 @RequestMapping("/login.html")
 public String login(Locale locale, Model model) {
  
  return "security/login";
 }
 
 @RequestMapping("/welcome.html")
 public String welcome(Locale locale, Model model) {
  
  return "security/welcome";
 }
}


작성4 views 폴더 밑에 index.jsp 작성
        (로그인 후 이름 보여줌)

<%@ page contentType="text/html;charset=utf-8" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ page session="false" %>
<html>
<head>
    <title>Home</title>
</head>
<body>
<h1>
    Hello world!
</h1>

<P>Username is ${username}</P>
<br>
<a href="<c:url value="j_spring_security_logout" />" target="_self">Logout</a>
</body>
</html>

작성5 views 밑에 home.jsp 작성 (별 내용은 없음)
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ page session="false" %>
<html>
<head>
<title>Home</title>
</head>
<body>
<h1>
Hello world!
</h1>

<P>  The time on the server is ${serverTime}. </P>
</body>
</html>


작성6 views/security 밑에 login.jsp 작성

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
login.jsp
</body>
</html>


작성7 views/security 밑에 welcome.jsp 작성

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
welcome.jsp
</body>
</html>


결과 ) localhost:8181/spring_security_pjt/login.html 접속
http://localhost:8181/spring_security_pjt/spring_security_login;jsessionid=B2716C95E6BB1302CF18F01226DB0236
이렇게 이동하면서 로그인 창이 뜸
알맞게 입력시
user -> login
admin -> admin
----------------------------------------------------------
여기에서는 어디로 접속하든지 spring 에서 제공하는
   로그인 페이지로 안내되어 처리됨
 (로그인 화면을 따로 작성하지 않음)


3. 로그인, 아웃 페이지 작성, 상태를 표시하기

-------------------------------
예제 1  기존 예제 그대로 사용

작성1 security-context.xml 에 다음 내용을 추가
        페이지를 설정해주면 같은 조건의 로그인이 필요한 사안에
        대해서 spring 에서 제공하는 페이지 정보가 아닌
        명시한 loginForm.html 이라는 페이지로 보낸다.

 
  
  
  
 


작성2 security/loginForm.jsp 작성
        인증 절차를 거치기 위한 name, value가 진한 부분같이
        작성해줘야 함
       taglib 러리 이용해서 작성함 (security uri를 call 하기 위해서)

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>loginForm.jsp</h1>
<form action="<c:url value="j_spring_security_check" />" method="post">
ID : <input type="text" name="j_username"> <br />
PW : <input type="text" name="j_password"> <br />
<input type="submit" value="LOGIN"> <br />
</form>
</body>
</html>


작성3 Controller.java 에 해당 호출을 추가

 @RequestMapping("loginForm.html")
 public String loginForm(Locale locale, Model model){
  return "security/loginForm";
 }


결과 )  http://localhost:8181/spring_security_pjt/
      welcom 화면 뜸
         http://localhost:8181/spring_security_pjt/login.html

        loginForm.jsp 를 호출함


+ 로그인 실패시 처리 방법
작성4 security-context.xml 수정

 
      
          
       



작성5 loginForm.jsp <body> 부분 수정

<h1>loginForm.jsp</h1>

<c:url value="j_spring_security_check" var="loginUrl"/>
<form action="${loginUrl}" method="post">
<c:if test="${param.ng != null}">
<p>
LogIn NG! <br />
<c:if test="${SPRING_SECURITY_LAST_EXCEPTION != NULL}">
message : <c:out value="${SPRING_SECURITY_LAST_EXCEPTION.message}" />
</c:if>
</p>
</c:if>
ID : <input type="text" name="j_username"> <br />
PW : <input type="text" name="j_password"> <br />
<input type="submit" value="LOGIN"> <br />
</form>

실행 ) 로그인 실패시 폼 내용이 ng 값 여부에 따라 변경되어 보여짐
        로그인 성공 -> 기존과 동일
    주황색 글시에서 logout을 처리하는 spring 코드가 있음
       id와 같이   j_spring_security_logout 을 보내면
       로그아웃 처리됨.

+ 로그아웃 처리 방법
작성6 login.jsp 에서 다음 내용을 추가

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
login.jsp
<c:if test ="${not empty pageContext.request.userPrincipal } ">
<p>is Log-in</p>
</c:if>

<c:if test="${empty pageContext.request.userPrincipal }">
<p> is Log-Out</p>
</c:if>

USER ID : ${pageContext.request.userPrincipal.name}<br/>
<a href="${pageContext.request.contextPath}/j_spring_security_logout">Log Out</a> <br />
</body>
</html>


4. 보안관련 taglis 사용방법


 org.springframework.security
 spring-security-taglibs
 3.2.4.RELEASE



처음에 미리 추가해놨음
태그 라이브러리를 추가함으로서
  jsp View 단 구현시 좀더 간단하게 구현이 가능함.

작성1 기존  login.jsp 파일에서
<%@ taglib uri="http://www.springframework.org/security/tags" prefix="s" %>
<!-- 태그 라이브러리를 추가한다 -->
....
<c:if test ="${not empty pageContext.request.userPrincipal } ">
<p>is Log-in</p>
</c:if>

<c:if test="${empty pageContext.request.userPrincipal }">
<p> is Log-Out</p>
</c:if>
<!-- s 태그를 이용해서 작성한다 -->
.....

USER ID : ${pageContext.request.userPrincipal.name}<br/>
.......


부분을 아래 문법으로 변경할 수 있음.

<s:authorize ifAnyGranted="ROLE_USER">
<p> is Log-In</p>
</s:authorize>

<s:authorize ifNotGranted="ROLE_USER">
<p> is Log-Out</p>
</s:authorize>
......

USER ID : <s:authentication property="name"/><br/>
.......


댓글 없음:

댓글 쓰기