'ITWeb/개발일반'에 해당되는 글 490건

  1. 2012.03.14 jdbc driver... log4jdbc
  2. 2012.03.14 [egovframework] 개발자 개발환경 설치가이드.
  3. 2012.03.14 전자정부표준프레임워크 - 다운로드.
  4. 2012.03.13 Spring framework 프로젝트 UTF-8 설정.
  5. 2012.03.13 4. Spring MVC 에 Hibernate 적용해 보기.
  6. 2012.03.12 Spring Security <password-encoder>
  7. 2012.03.12 Spring Security InMemory + JDBCImpl 설정 방법.
  8. 2012.03.12 Spring Security JDBC 연동을 위한 Schema
  9. 2012.03.12 Spring Security login/logout 관련 글.
  10. 2012.03.12 3. Spring MVC 에 Spring Security 적용해 보기 1

jdbc driver... log4jdbc

ITWeb/개발일반 2012. 3. 14. 12:10

흔히 많이 사용하던 mysql 용 JDBC Driver

com.mysql.jdbc.Driver


예전 부터 있었던 내용인데 그냥 회상용으로 올려봅니다.

내가 사용하는 DBMS 가 뭔지 고민하지 않고 알아서 적절한 jdbc driver 를 사용하게 해주는 아주 유용한 jdbc proxy util 이라고 하면 될 것 같습니다.

- 여기 들어가 보시면 잘 나와 있구요.

최근에 많이 쓰는건 아래와 같습니다.


[pom.xml 설정]

<dependency>

  <groupId>org.lazyluke</groupId>

  <artifactId>log4jdbc-remix</artifactId>

  <version>0.2.7</version>

</dependency>



[driverClassName]

jdbc.driverClassName=net.sf.log4jdbc.DriverSpy



뭐 늘 그렇지만 배울것도 많아 지는 것도 사실이지만 개발하는데 필요한 툴들도 많이 편리해 지고 있는 것도 사실인것 같내요. 
:

[egovframework] 개발자 개발환경 설치가이드.

ITWeb/개발일반 2012. 3. 14. 11:35
[참고문서]


일단 사용 소감은 그냥 샘플 템플릿을 이용해서 프로젝트 샘플이 후다닥 생성되고 바로 실행 결과를 볼수 있어서 쉽게 제공해주는 것 같습니다.

[수정한내용]

- DB 접속 정보 수정
- 제공되는 Schema DDL 을 이용해서 Table 생성
- 참고문서에 나와 있는 것처럼 mysql 을 사용하기 때문에 관련 정보 수정 


실행 하면 바로 화면 뜹니다.. ㅎㅎ



※ 그 이외는 그냥 spring mvc 기반으로 개발 하시면 될 것 같구요. 이제 전자정부의 콤포넌트를 사용해봐야겠내요..  
:

전자정부표준프레임워크 - 다운로드.

ITWeb/개발일반 2012. 3. 14. 09:56
전자정부표준프레임워크 다운로드 받는데 회원 가입을 시키다뉘...
뭐.. 암튼..
그래서 다운로드를 받았습니다.


용량이 커서 요기에는 못올리겠내요.. ^^;
정부 사업을 할라면.. 이런것도 알아 놔야 하겠죠!! 
:

Spring framework 프로젝트 UTF-8 설정.

ITWeb/개발일반 2012. 3. 13. 18:38
mybatis 랑 hibernate 로 작업 하면서.. insert 하다.. 한글이 다 깨져서 DB 에 들어가길래.. 설정 점검 차원에서 article 공유 합니다.

[참고사이트]

[기본]

- eclipse 설정
- web.xml
- servlet-context.xml
- DB 설정
- WAS 나 Web Server 설정 



[참고사이트 글 스크랩]

1. Tomcat 및 서블릿 컨테이너 encoding 설정


$CATALINA_HOME/conf/server.xml (이클립스 IDE를 사용한다면 Servers폴더 밑에 server.xml)을 수정한다.

Connector에 URIEncoding="UTF-8" 을 추가한다.



2. web.xml에 encoding filter를 만든다.




filter-class : org.springframework.web.filter.CharacacterEncodingFilter


3. ViewResolver의 property 속성중에 contentType을 UTF-8로 추가한다.


4. JSP페이지의 contentType을 UTF-8로 설정한다. 그리고 HTML의 content을 UTF-8로 설정한다.


 

 

 

==========================================================================================================================
==========================================================================================================================

 

 

개발을 하다보면 캐릭터셋문제로 골머리를 앓는 경우가 많이 있다.  필자는 그래서 신규로 프로젝트를 시작할 경우 아예 모든 환경을 UTF-8로 셋팅해 버린다. 물론 UTF-8까지 필요가 있을까 하는 생각을 할 수도 있지만 나중에 다국어환경을 고려해도 아예 UTF-8로 시작하는게 나쁜 방법은 아닌것 같다.
다음은 UTF-8로 개발환경을 셋팅하는 방법이다.

1. 이클립스의 Content type을 UTF-8로 설정
   - 이렇게 설정하면 해당하는 type을 파일로 저장할 때 UTF-8형식으로 저장하게 된다.



2. Workspace의 Text file encoding을 UTF-8로 선택
   - 이렇게 설정해야 svn의 소스비교시 캐릭터셋이 깨지는 문제를 막을 수 있다.



3. 데이터베이스 인스턴스를 UTF-8형태로 생성
  - Mysql같은 경우 아래와 같은 방식으로 생성하면 된다.

CREATE DATABASE database_utf8 DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;


4. web.xml에 아래와 같이 인코딩 필터 셋팅
  - 서블릿과 통신할 때 데이터를 주고 받는 것에 대한 인코딩을 설정하는 부분이다.

<filter>
    <filter-name>encodingFilter</filter-name>
    <filter-class>
        org.springframework.web.filter.CharacterEncodingFilter
    </filter-class>
    <init-param>
        <param-name>encoding</param-name>
        <param-value>UTF-8</param-value>
    </init-param>
  </filter> 
  <filter-mapping>
      <filter-name>encodingFilter</filter-name>
      <url-pattern>/*</url-pattern>
  </filter-mapping> 
</filter>


5. 톰캣설치디렉토리의 /conf/server.xml 에 URIEncoding 항목 추가
  - WAS와 get방식으로 데이터를 주고받는 것에 대한 인코딩 설정부분이다.

<Connector port="8080" URIEncoding="UTF-8" maxHttpHeaderSize="8192"
               maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
               enableLookups="false" redirectPort="8443" acceptCount="100"
               connectionTimeout="20000" disableUploadTimeout="true" />


6. JSP파일의 최상단에 UTF-8 directive 추가
  - JSP컴파일시 사용할 인코딩을 설정하는 부분이다.

<%@ page language="java" contentType="text/html; charset=UTF-8"    pageEncoding="UTF-8"%>


7. JSP파일의 meta태그에 UTF-8추가
  - 브라우저에서 인식할 캐릭터셋을 설정하는 부분이다.

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>


8. 메이븐을 쓴다면 다음과 같이 plugin에 UTF-8 설정을 추가해 준다.

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <configuration>
        <source>1.5</source>
        <target>1.5</target>
        <encoding>UTF-8</encoding>
    </configuration>
</plugin>
<plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-javadoc-plugin</artifactId>
        <configuration>
                <charset>UTF-8</charset>
                <docencoding>UTF-8</docencoding>
                <encoding>UTF-8</encoding>
                <quiet>true</quiet>
        </configuration>
</plugin>     
<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-pmd-plugin</artifactId>
  <version>2.4</version>
  <configuration>
    <sourceEncoding>utf-8</sourceEncoding>
    <targetJdk>1.5</targetJdk>
    <minimumTokens>10</minimumTokens>
  </configuration>
</plugin>

 
:

4. Spring MVC 에 Hibernate 적용해 보기.

ITWeb/개발일반 2012. 3. 13. 16:18
※ 아래 코드에 delete 시 동작 안하는 문제가 있어서 코드 수정했습니다.
 

[contact.xml]

<id name="id" type="long"> // int 에서 long 으로 변경

 
[Contact*.java]

private Long id; // 역시 int 에서 Long 으로 변경 당연히 setter/getter/param 다 변경


[ContactDAOImpl.java]

// ...delete(contact); 가 정상적으로 동작하지 않아 아래 처럼 변경.
this.sessionFactory.getCurrentSession().createQuery("delete Contact where id=:id").setLong("id", id).executeUpdate();


[수정된 Project]
 proto.orm.zip





Spring MVC 에 다른 사이트의 HIbernate 예제 코드로 작성하였습니다.
- 해당 예제 코드를 그대로 사용할경우 안되는 부분이 있어서 직접 수정하여 반영합니다.

[Hibernate 예제코드]


[소스코드]

- Eclipse import 하시면 프로젝트 확인 가능 합니다.


※ import/export 방법은 아래 글 참고하세요.
http://jjeong.tistory.com/564 


1. Spring MVC 구성해 보기.
2. Spring MVC 에 MyBatis 적용해 보기.
3. Spring MVC 에 Spring Security 적용해 보기. 
4. Spring MVC 에 Hibernate 적용해 보기. 
5. 2+3번 적용해 보기.
6. 3+4번 적용해 보기. 


- 소스코드를 첨부 하였으므로 요약 정보만 기술 합니다.

[Table 생성]

Database : Mysql.protodb

CREATE TABLE CONTACTS

(

    id              INT PRIMARY KEY AUTO_INCREMENT,

    firstname    VARCHAR(30),

    lastname    VARCHAR(30),

    telephone   VARCHAR(15),

    email         VARCHAR(30),

    created     TIMESTAMP DEFAULT NOW()

); 



[pom.xml]

        <!-- spring framework jdbc 설정 -->

        <dependency>

            <groupId>org.springframework</groupId>

            <artifactId>spring-jdbc</artifactId>

            <version>${org.springframework-version}</version>

        </dependency>


        <!-- spring framework transaction 설정 -->

        <dependency>

            <groupId>org.springframework</groupId>

            <artifactId>spring-tx</artifactId>

            <version>${org.springframework-version}</version>

        </dependency>


        <!-- spring framework orm 설정 -->

        <dependency>

            <groupId>org.springframework</groupId>

            <artifactId>spring-orm</artifactId>

            <version>${org.springframework-version}</version>

        </dependency>


        <!-- hibernate dependency 설정 start -->

        <dependency>

            <groupId>org.hibernate</groupId>

            <artifactId>hibernate-core</artifactId>

            <version>3.6.9.Final</version>

        </dependency>


        <dependency>

            <groupId>dom4j</groupId>

            <artifactId>dom4j</artifactId>

            <version>1.6.1</version>

        </dependency>

        <dependency>

            <groupId>commons-collections</groupId>

            <artifactId>commons-collections</artifactId>

            <version>3.2.1</version>

        </dependency>


        <dependency>

            <groupId>org.javassist</groupId>

            <artifactId>javassist</artifactId>

            <version>3.15.0-GA</version>

        </dependency>


        <dependency>

            <groupId>cglib</groupId>

            <artifactId>cglib</artifactId>

            <version>2.2.2</version>

        </dependency>


        <dependency>

            <groupId>org.apache.commons</groupId>

            <artifactId>commons-lang3</artifactId>

            <version>3.1</version>

        </dependency>

        <!-- hibernate dependency 설정 end -->


        <!-- mysql -->

        <dependency>

            <groupId>mysql</groupId>

            <artifactId>mysql-connector-java</artifactId>

            <version>5.1.18</version>

        </dependency>


        <!-- apache commons dbcp -->

        <dependency>

            <groupId>commons-dbcp</groupId>

            <artifactId>commons-dbcp</artifactId>

            <version>1.2.2</version>

        </dependency>

- dependency 관련 파일들은 이제 어느 정도 설정 하는데 무리가 없으시죠. 자세한 내용은 아래 링크에


[web.xml]

 <context-param>

        <param-name>contextConfigLocation</param-name>

        <param-value>

            /WEB-INF/spring/root-context.xml

            classpath:context/**/applicationContext*.xml

        </param-value>

    </context-param>
.... 중략

    <filter>

   <filter-name>openSessionInViewFilter</filter-name>

   <filter-class>

       org.springframework.orm.hibernate3.support.OpenSessionInViewFilter

   </filter-class>

    </filter>


    <filter-mapping>

        <filter-name>openSessionInViewFilter</filter-name>

        <url-pattern>/*</url-pattern>

    </filter-mapping> 



[applicationContext-hibernate.xml]

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"

    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"

    xmlns:context="http://www.springframework.org/schema/context"

    xmlns:jee="http://www.springframework.org/schema/jee" xmlns:lang="http://www.springframework.org/schema/lang"

    xmlns:p="http://www.springframework.org/schema/p" xmlns:tx="http://www.springframework.org/schema/tx"

    xmlns:util="http://www.springframework.org/schema/util"

    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd

        http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd

        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd

        http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee.xsd

        http://www.springframework.org/schema/lang http://www.springframework.org/schema/lang/spring-lang.xsd

        http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd

        http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd">


    <bean id="messageSource"

        class="org.springframework.context.support.ReloadableResourceBundleMessageSource">

        <property name="basename" value="classpath:messages/message" />

        <property name="defaultEncoding" value="UTF-8" />

    </bean>


    <bean id="localeChangeInterceptor"

        class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor">

        <property name="paramName" value="lang" />

    </bean>


    <bean id="localeResolver"

        class="org.springframework.web.servlet.i18n.CookieLocaleResolver">

        <property name="defaultLocale" value="ko" />

    </bean>


    <bean id="handlerMapping"

        class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping">

        <property name="interceptors">

            <ref bean="localeChangeInterceptor" />

        </property>

    </bean>


    <bean id="propertyConfigurer"

        class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"

        p:location="classpath:configuration/hibernate/config.properties" />


    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"

    destroy-method="close">

    <property name="driverClassName" value="${jdbc.driverClassName}" />

    <property name="url" value="${jdbc.url}" />

    <property name="username" value="${jdbc.username}" />

    <property name="password" value="${jdbc.password}" />

    </bean>


    <bean id="sessionFactory"

        class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">

        <property name="dataSource" ref="dataSource" />

        <property name="hibernateProperties">

            <props>

                <prop key="hibernate.dialect">${jdbc.dialect}</prop>

                <prop key="hibernate.show_sql">true</prop>

            </props>

        </property>

        <property name="mappingResources">

            <list>

                <value>/sql/hibernate/mapper/contact.xml</value>

            </list>

        </property>

    </bean>


    <bean id="transactionManager"

        class="org.springframework.orm.hibernate3.HibernateTransactionManager">

        <property name="sessionFactory" ref="sessionFactory" />

    </bean>


    <tx:annotation-driven transaction-manager="transactionManager" />


    <bean id="contactDAO" class="proto.orm.board.contact.dao.ContactDAOImpl">

        <property name="sessionFactory" ref="sessionFactory" />

    </bean>

</beans>

- 간혹 아래와 같은 오류가 날때가 있습니다.

org.hibernate.HibernateException: No Session found for current thread

-> 이건 sessionFactory 설정을 잘못해서 나옵니다.

-> sessionFactory 를 중복 선언 하거나 (include 도니 파일 잘 찾아 보세요.)

-> web.xml 에 openSessionInViewFilter 설정이 빠져 있는지 확인 합니다.



Unable to instantiate default tuplizer 

-> 이건 domain 객체에서 setter/getter 설정 오류 이거나 mapping 오류일 경우 발생 합니다.

-> domain 객체를 한번 검토해 보시고 hibernate mapping xml 에 선언한 내용과 일치 하는지도 확인해 보세요.



org.hibernate.hql.ast.QuerySyntaxException: xxxx is not mapped [FROM xxxx]  

-> 이건  createQuery("FROM 도메인객체명") 으로 표기를 해야 하는데 간혹 Table 이른을 넣다 보면 오류가 납니다.

-> 본 예제에서는 Contact Object 이므로 createQuery("FROM Contact") 이라고 써줘야 합니다. 



[config.properties]

jdbc.driverClassName=com.mysql.jdbc.Driver

jdbc.dialect=org.hibernate.dialect.MySQLDialect

jdbc.url=jdbc:mysql://localhost:3306/protodb?autoReconnect=true

jdbc.username=root

jdbc.password=1234



[contact.xml]

<?xml version="1.0"?>

<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"

"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping>

    <class name="proto.orm.board.contact.domain.Contact" table="contacts">

        <id name="id" type="int">

            <column name="id" />

            <generator class="identity" />

        </id>

        <property name="firstname" type="string">

            <column name="firstname" length="30" not-null="false" />

        </property>

        <property name="lastname" type="string">

            <column name="lastname" length="30" not-null="false" />

        </property>

        <property name="telephone" type="string">

            <column name="telephone" length="15" not-null="false" />

        </property>

        <property name="email" type="string">

            <column name="email" length="30" not-null="false" />

        </property>

        <property name="created" type="timestamp">

            <column name="created" not-null="false" />

        </property>

    </class>

</hibernate-mapping>

- 이 파일은 hibernate ref. 중 mapping 부분 참고하세요.



[ContactController.java]


[ContactServiceImpl.java] 


[ContactDAOImpl.java] 


[Contact.java]


[contact.jsp]


[참고사이트]

:

Spring Security <password-encoder>

ITWeb/개발일반 2012. 3. 12. 18:05
코드는 아래 처럼 사용하면 됩니다.

        <authentication-provider user-service-ref="userDetailsService">

            <password-encoder hash="md5" base64="true"/>

        </authentication-provider>

- 의미는 md5 hash 알고리즘을 사용하고,
- base64 인코딩을 해서 사용한다는 의미 입니다.
- 결국 client 에서 전달 되는 값들을 md5 로 암호화 하고 base64로 인코딩 후 password 비교를 하게 됩니다.
- DB 에 password 저장 시 당연히 md5 암호화를 하고 base64 encoding 후 저장을 해야 정상적으로 비교가 되겠죠..

[참고내용]
- URL :  http://static.springsource.org/spring-security/site/docs/3.1.x/reference/springsecurity-single.html#nsa-password-encoder 

B.2.4 <password-encoder>

Authentication providers can optionally be configured to use a password encoder as described in the namespace introduction. This will result in the bean being injected with the appropriate PasswordEncoder instance, potentially with an accompanying SaltSource bean to provide salt values for hashing.

Parent Elements of <password-encoder>

<password-encoder> Attributes

base64

Whether a string should be base64 encoded

hash

Defines the hashing algorithm used on user passwords. We recommend strongly against using MD4, as it is a very weak hashing algorithm.

ref

Defines a reference to a Spring bean that implements PasswordEncoder .

Child Elements of <password-encoder>


:

Spring Security InMemory + JDBCImpl 설정 방법.

ITWeb/개발일반 2012. 3. 12. 17:22
가장 쉽게 접근할 수 있는 방법에 대해서 기술 합니다.
모든 내용의 기초는 아래 사이트에서 참고하였습니다.
- 없는건 검색했고요.. ㅎㅎ

 

[spring-security.xml InMemory] 

<?xml version="1.0" encoding="UTF-8"?>

<beans:beans xmlns="http://www.springframework.org/schema/security"

    xmlns:beans="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

    xsi:schemaLocation="http://www.springframework.org/schema/beans

           http://www.springframework.org/schema/beans/spring-beans-3.0.xsd

           http://www.springframework.org/schema/security

           http://www.springframework.org/schema/security/spring-security-3.1.xsd">


    <global-method-security secured-annotations="enabled" />


    <http auto-config='true'>

        <intercept-url pattern="/login.html*" access="IS_AUTHENTICATED_ANONYMOUSLY" />

        <intercept-url pattern="/welcome.html*" access="IS_AUTHENTICATED_ANONYMOUSLY" />

        <intercept-url pattern="/**" access="ROLE_ADMIN" />

        <form-login login-page='/login.html' default-target-url='/index.html' always-use-default-target='true' authentication-failure-url="/login.html" />

        <logout logout-success-url="/welcome.html" delete-cookies="JSESSIONID" />

        <remember-me key="daSDAsdaSDsa" />

    </http>


    <authentication-manager>

        <authentication-provider>

<!-- in memory case user-service start -->

            <user-service>

                <user name="jimi" password="1234" authorities="ROLE_USER, ROLE_ADMIN" />

                <user name="bob" password="1234" authorities="ROLE_USER" />

            </user-service>

<!-- in memory case user-service end -->

        </authentication-provider>

    </authentication-manager> 



[spring-security.xml JDBCImpl Case 1]
- InMemory 코드에서 빨간 부분이 변경 됩니다.

<!-- jdbcImpl case 1 start -->

            <jdbc-user-service data-source-ref="dataSource"

                users-by-username-query="SELECT username, password, enabled FROM users WHERE username=?"

                authorities-by-username-query="SELECT u.username, au.authority FROM users u, authorities au WHERE u.username=? AND au.username=u.username"

            />

<!-- jdbcImpl case 1 end -->



[spring-security.xml JDBCImpl Case 2]

<?xml version="1.0" encoding="UTF-8"?>

<beans:beans xmlns="http://www.springframework.org/schema/security"

    xmlns:beans="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

    xsi:schemaLocation="http://www.springframework.org/schema/beans

           http://www.springframework.org/schema/beans/spring-beans-3.0.xsd

           http://www.springframework.org/schema/security

           http://www.springframework.org/schema/security/spring-security-3.1.xsd">


    <global-method-security secured-annotations="enabled" />


    <http auto-config='true'>

        <intercept-url pattern="/login.html*" access="IS_AUTHENTICATED_ANONYMOUSLY" />

        <intercept-url pattern="/welcome.html*" access="IS_AUTHENTICATED_ANONYMOUSLY" />

        <intercept-url pattern="/**" access="ROLE_ADMIN" />

        <form-login login-page='/login.html' default-target-url='/index.html' always-use-default-target='true' authentication-failure-url="/login.html" />

        <logout logout-success-url="/welcome.html" delete-cookies="JSESSIONID" />

        <remember-me key="daSDAsdaSDsa" />

    </http>


    <authentication-manager>

<!-- jdbcImpl case 2 start -->

        <authentication-provider user-service-ref="userDetailsService" />

<!-- jdbcImpl case 2 end -->

    </authentication-manager>


<!-- jdbcImpl case 2 start -->

    <beans:bean id="userDetailsService" class="org.springframework.security.core.userdetails.jdbc.JdbcDaoImpl">

        <beans:property name="dataSource" ref="dataSource"/>

    </beans:bean>

<!-- jdbcImpl case 2 end -->

</beans:beans>


※ 이넘들이 사용하는 Table Schema 는 아래 글 참고 하세요.
http://jjeong.tistory.com/610  

그리고 참고하기 위해서 JdbcDaoImpl.java 코드 올려 봅니다. 
이 코드를 보시면 이해 하는데 도움이 될겁니다.

※ 코드를 보시니 이제 감이 오시나요???
그렇습니다.
JdbcImpl.java 와 같은 넘을 biz 요구사항에 맞춰서 작성을 하시면 customized authentication 과 authority 를 구현 하실 수 있습니다. ^^ 
그래도 잘 모르시겠다구요.
그럼 아래를 참고하세요.
이미 정리 된 문서가 있어서 link 겁니다.

[원본링크]

 
:

Spring Security JDBC 연동을 위한 Schema

ITWeb/개발일반 2012. 3. 12. 15:50

[Spring Security JDBC 연동을 위한 Schema]

 CREATE TABLE users(

      username varchar_ignorecase(50) NOT NULL PRIMARY KEY,

      PASSWORD varchar_ignorecase(50) NOT NULL,

      enabled BOOLEAN NOT NULL);


 CREATE TABLE authorities (

      username varchar_ignorecase(50) NOT NULL,

      authority varchar_ignorecase(50) NOT NULL,

      CONSTRAINT fk_authorities_users FOREIGN KEY(username) REFERENCES users(username));

      CREATE UNIQUE INDEX ix_auth_username ON authorities (username,authority);

      

CREATE TABLE groups (

  id BIGINT generated BY DEFAULT AS identity(START WITH 0) PRIMARY KEY,

  group_name varchar_ignorecase(50) NOT NULL);


CREATE TABLE group_authorities (

  group_id BIGINT NOT NULL,

  authority VARCHAR(50) NOT NULL,

  CONSTRAINT fk_group_authorities_group FOREIGN KEY(group_id) REFERENCES groups(id));


CREATE TABLE group_members (

  id BIGINT generated BY DEFAULT AS identity(START WITH 0) PRIMARY KEY,

  username VARCHAR(50) NOT NULL,

  group_id BIGINT NOT NULL,

  CONSTRAINT fk_group_members_group FOREIGN KEY(group_id) REFERENCES groups(id));      

  

CREATE TABLE persistent_logins (

  username VARCHAR(64) NOT NULL,

  series VARCHAR(64) PRIMARY KEY,

  token VARCHAR(64) NOT NULL,

  last_used TIMESTAMP NOT NULL);  

 
※ 참고링크


[Mysql 용으로 변형] 

 CREATE TABLE users(

      username VARCHAR(50) NOT NULL,

      PASSWORD VARCHAR(50) NOT NULL,

      enabled BOOLEAN NOT NULL,

      PRIMARY KEY (username));


 CREATE TABLE authorities (

      username VARCHAR(50) NOT NULL,

      authority VARCHAR(50) NOT NULL

 );


CREATE UNIQUE INDEX ix_auth_username ON authorities (username,authority);

INSERT INTO users(username, PASSWORD, enabled) VALUE('henry', MD5('1234'), TRUE);   

INSERT INTO users(username, PASSWORD, enabled) VALUE('guest', MD5('1234'), TRUE); 

      

CREATE TABLE groups (

  id BIGINT(11) NOT NULL AUTO_INCREMENT,

  group_name VARCHAR(50) NOT NULL,

  PRIMARY KEY (id));


CREATE TABLE group_authorities (

  group_id BIGINT NOT NULL,

  authority VARCHAR(50) NOT NULL

);


CREATE TABLE group_members (

  id BIGINT(11) NOT NULL AUTO_INCREMENT,

  username VARCHAR(50) NOT NULL,

  group_id BIGINT NOT NULL,

  PRIMARY KEY (id));

  

CREATE TABLE persistent_logins (

  username VARCHAR(64) NOT NULL,

  series VARCHAR(64) PRIMARY KEY,

  token VARCHAR(64) NOT NULL,

  last_used TIMESTAMP NOT NULL);

- 참고로 제가 설치해서 사용하고 있는 mysql server 는 5.5 입니다.
- 5.6 부터는 base64 관련 함수가 포함이 되어 있더군요.. 흠..  
:

Spring Security login/logout 관련 글.

ITWeb/개발일반 2012. 3. 12. 15:21
기본적으로 아래 페이지를 한번 정독 하시면 어떻게 하는지 아실 수 있습니다.

그럼에도 불구하고 샘플코드가 잘 정리된게 있으면 좋겠죠.
굳이 제가 정리 하지 않아도 잘 정리된게 있어서 첨부 합니다.

[원본글 링크]

[Login 예제]

Defined your custom login form in Spring XML file. See explanation below :

  1. login-page=”/login” – The login form will be “/login”
  2. default-target-url=”/welcome” – If authentication success, forward to “/welcome”
  3. authentication-failure-url=”/loginfailed” – If authentication failed, forward to “/loginfailed”
  4. logout-success-url=”/logout” – If logout , forward to “/logout”

File : spring-security.xml

<beans:beans xmlns="http://www.springframework.org/schema/security"
	xmlns:beans="http://www.springframework.org/schema/beans" 
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://www.springframework.org/schema/beans
	http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
	http://www.springframework.org/schema/security
	http://www.springframework.org/schema/security/spring-security-3.0.3.xsd">
 
	<http auto-config="true">
		<intercept-url pattern="/welcome*" access="ROLE_USER" />
		<form-login login-page="/login" default-target-url="/welcome"
			authentication-failure-url="/loginfailed" />
		<logout logout-success-url="/logout" />
	</http>
 
	<authentication-manager>
	  <authentication-provider>
		<user-service>
			<user name="mkyong" password="123456" authorities="ROLE_USER" />
		</user-service>
	  </authentication-provider>
	</authentication-manager>
 
</beans:beans>

In custom login form, you have to follow Spring Security standard name :

  1. j_spring_security_check – Login service
  2. j_spring_security_logout – Logout service
  3. j_username – Username
  4. j_password – Password

To display authentication error messages, use this :

${sessionScope["SPRING_SECURITY_LAST_EXCEPTION"].message}

File : login.jsp

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<html>
<head>
<title>Login Page</title>
<style>
.errorblock {
	color: #ff0000;
	background-color: #ffEEEE;
	border: 3px solid #ff0000;
	padding: 8px;
	margin: 16px;
}
</style>
</head>
<body onload='document.f.j_username.focus();'>
	<h3>Login with Username and Password (Custom Page)</h3>
 
	<c:if test="${not empty error}">
		<div class="errorblock">
			Your login attempt was not successful, try again.<br /> Caused :
			${sessionScope["SPRING_SECURITY_LAST_EXCEPTION"].message}
		</div>
	</c:if>
 
	<form name='f' action="<c:url value='j_spring_security_check' />"
		method='POST'>
 
		<table>
			<tr>
				<td>User:</td>
				<td><input type='text' name='j_username' value=''>
				</td>
			</tr>
			<tr>
				<td>Password:</td>
				<td><input type='password' name='j_password' />
				</td>
			</tr>
			<tr>
				<td colspan='2'><input name="submit" type="submit"
					value="submit" />
				</td>
			</tr>
			<tr>
				<td colspan='2'><input name="reset" type="reset" />
				</td>
			</tr>
		</table>
 
	</form>
</body>
</html>

File : hello.jsp

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<html>
<body>
	<h3>Message : ${message}</h3>	
	<h3>Username : ${username}</h3>	
 
	<a href="<c:url value="/j_spring_security_logout" />" > Logout</a>
 
</body>
</html>



[Logout 예제]

In Spring Security, to log out, just add a link to url “j_spring_security_logout“, for example :

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<html>
<body>
	<h3>messages, whatever</h3>	
	<a href="<c:url value="j_spring_security_logout" />" > Logout</a>
</body>
</html>

In Spring security, declares “logout” tag, and configure the “logout-success-url” attribute :

<beans:beans xmlns="http://www.springframework.org/schema/security"
	xmlns:beans="http://www.springframework.org/schema/beans" 
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://www.springframework.org/schema/beans
	http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
	http://www.springframework.org/schema/security
	http://www.springframework.org/schema/security/spring-security-3.0.3.xsd">
 
	<http auto-config="true">
		<intercept-url pattern="/welcome*" access="ROLE_USER" />
		<logout logout-success-url="/welcome" />
	</http>
 
	<authentication-manager>
	  <authentication-provider>
	    <user-service>
		<user name="mkyong" password="password" authorities="ROLE_USER" />
	    </user-service>
	  </authentication-provider>
	</authentication-manager>
 
</beans:beans>



[Database Login]

1. Database Tables

In database, you need to create two tables to store user details and user role details, one to many relationship, one user can contains many roles.

A simple and standard table design for user role relationship. And, you are allow to add extra columns for extra functionality. In additional, the table name and column name are not fixed, you can rename to whatever name.

P.S All scripts in MySQL.

CREATE TABLE `users` (
  `USER_ID` INT(10) UNSIGNED NOT NULL,
  `USERNAME` VARCHAR(45) NOT NULL,
  `PASSWORD` VARCHAR(45) NOT NULL,
  `ENABLED` tinyint(1) NOT NULL,
  PRIMARY KEY (`USER_ID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE `user_roles` (
  `USER_ROLE_ID` INT(10) UNSIGNED NOT NULL,
  `USER_ID` INT(10) UNSIGNED NOT NULL,
  `AUTHORITY` VARCHAR(45) NOT NULL,
  PRIMARY KEY (`USER_ROLE_ID`),
  KEY `FK_user_roles` (`USER_ID`),
  CONSTRAINT `FK_user_roles` FOREIGN KEY (`USER_ID`) REFERENCES `users` (`USER_ID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

Insert data for testing, now an user “mkyong” is created and contains role named “ROLE_USER“.

INSERT INTO mkyongdb.users (USER_ID, USERNAME,PASSWORD, ENABLED)
VALUES (100, 'mkyong', '123456', TRUE);
 
INSERT INTO mkyongdb.user_roles (USER_ROLE_ID, USER_ID,AUTHORITY)
VALUES (1, 100, 'ROLE_USER');

2. Spring JDBC

Create a data source bean, and connect to database via Spring JDBC.

<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://www.springframework.org/schema/beans
	http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
 
   <bean id="dataSource"
	class="org.springframework.jdbc.datasource.DriverManagerDataSource">
 
	<property name="driverClassName" value="com.mysql.jdbc.Driver" />
	<property name="url" value="jdbc:mysql://localhost:3306/mkyongdb" />
	<property name="username" value="root" />
	<property name="password" value="password" />
   </bean>
 
</beans>

3. Spring Security

In Spring security configuration file, use “jdbc-user-service” tag, and define your query to get the data from database.

<beans:beans xmlns="http://www.springframework.org/schema/security"
	xmlns:beans="http://www.springframework.org/schema/beans" 
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://www.springframework.org/schema/beans
	http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
	http://www.springframework.org/schema/security
	http://www.springframework.org/schema/security/spring-security-3.0.3.xsd">
 
	<http auto-config="true">
		<intercept-url pattern="/welcome*" access="ROLE_USER" />
		<form-login login-page="/login" default-target-url="/welcome"
			authentication-failure-url="/loginfailed" />
		<logout logout-success-url="/logout" />
	</http>
 
	<authentication-manager>
	   <authentication-provider>
		<jdbc-user-service data-source-ref="dataSource"
 
		   users-by-username-query="
		      select username,password, enabled 
		      from users where username=?" 
 
		   authorities-by-username-query="
		      select u.username, ur.authority from users u, user_roles ur 
		      where u.user_id = ur.user_id and u.username =?  " 
 
		/>
	   </authentication-provider>
	</authentication-manager>
 
</beans:beans>




:

3. Spring MVC 에 Spring Security 적용해 보기

ITWeb/개발일반 2012. 3. 12. 12:40
Spring MVC 에 기본 Minimal http configuration 에대한 소스 코드만 삽입해 놓습니다.
확장 버전은 직접 해보시는면 좋겠죠.
- 다만, 진행 하면서 코드는 추가 하겠습니다.

[소스코드]

- Eclipse import 하시면 프로젝트 확인 가능 합니다.


※ import/export 방법은 아래 글 참고하세요.
http://jjeong.tistory.com/564 


1. Spring MVC 구성해 보기.
2. Spring MVC 에 MyBatis 적용해 보기.
3. Spring MVC 에 Spring Security 적용해 보기. 
4. Spring MVC 에 Hibernate 적용해 보기. 
5. 2+3번 적용해 보기.
6. 3+4번 적용해 보기. 


- 소스코드를 첨부 하였으므로 요약 정보만 기술 합니다.

[참고링크]


[pom.xml]
- spring security 관련 dependency 추가 합니다.

<!-- Spring Security 사용을 위한 dependency 등록 Start -->

        <dependency>

            <groupId>org.springframework.security</groupId>

            <artifactId>spring-security-core</artifactId>

            <version>3.1.0.RELEASE</version>

        </dependency>

        <dependency>

            <groupId>org.springframework.security</groupId>

            <artifactId>spring-security-web</artifactId>

            <version>3.1.0.RELEASE</version>

        </dependency>

        <dependency>

            <groupId>org.springframework.security</groupId>

            <artifactId>spring-security-config</artifactId>

            <version>3.1.0.RELEASE</version>

        </dependency>

<!-- Spring Security 사용을 위한 dependency 등록 End -->



[web.xml]
- security 관련 fitler 와 context 설정을 등록 합니다.

    <context-param>

        <param-name>contextConfigLocation</param-name>

        <param-value>

        /WEB-INF/spring/root-context.xml

        classpath:context/**/applicationContext*.xml

        </param-value>

    </context-param>


<!-- Spring Security 사용을 위해 filter 추가 Start -->

    <filter>

        <filter-name>springSecurityFilterChain</filter-name>

        <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>

    </filter>


    <filter-mapping>

        <filter-name>springSecurityFilterChain</filter-name>

        <url-pattern>/*</url-pattern>

    </filter-mapping>

<!-- Spring Security 사용을 위해 filter 추가 End -->



[application-security.xml]
- http security 관련 설정을 합니다.
- 메모리 기반의 인증 처리 방식 입니다. (추후 업그레이드가 되어야 하는 부분)

<?xml version="1.0" encoding="UTF-8"?>

<beans:beans xmlns="http://www.springframework.org/schema/security"

    xmlns:beans="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

    xsi:schemaLocation="http://www.springframework.org/schema/beans

           http://www.springframework.org/schema/beans/spring-beans-3.0.xsd

           http://www.springframework.org/schema/security

           http://www.springframework.org/schema/security/spring-security-3.1.xsd">


    <http auto-config='true'>

        <intercept-url pattern="/**" access="ROLE_USER" />

    </http>


    <authentication-manager>

        <authentication-provider>

            <user-service>

                <user name="jimi" password="1234" authorities="ROLE_USER, ROLE_ADMIN" />

                <user name="bob" password="1234" authorities="ROLE_USER" />

            </user-service>

        </authentication-provider>

    </authentication-manager>

</beans:beans>



[실행하기]
- Spring MVC 예제에서 했던 것과 같습니다.
- 이전 글을 참고해 주세요.

- 아래는 실행 시킨 결과 화면 입니다.

[테스트URL]
http://localhost:8080/security/index.html 

[인증 전]

 
[인증 후] 

 


※ 보시는 것 처럼 spring security의 시작은 아주 쉽게 따라 할 수 있습니다. 문서를 잘 참고 하시면 됩니다.
: