2014年3月29日土曜日

Spring Security 設定

pom.xml 設定


Spring Security 3.2.3.RELEASE を指定すると、
Spring Framework 3.1.1.RELEASE との組み合わせで deprecated 警告が発生。
Spring Framework を 3.2.8.RELEASE にバージョンアップ。
velocity 関連が context から context-support に移動したため、これも追加。
<org.springframework-version>3.2.8.RELEASE</org.springframework-version>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context-support</artifactId>
    <version>${org.springframework-version}</version>
</dependency>
<dependency>
    <groupId>org.springframework.security</groupId>
    <artifactId>spring-security-web</artifactId>
    <version>3.2.3.RELEASE</version>
</dependency>
<dependency>
    <groupId>org.springframework.security</groupId>
    <artifactId>spring-security-config</artifactId>
    <version>3.2.3.RELEASE</version>
</dependency>

MySQL テーブル作成


password フィールドの長さがマニュアル通りだと、sha256 暗号化した場合に足りないので変更する。
create table users(
    username varchar(50) not null primary key,
    password varchar(100) not null,
    enabled boolean not null
);
create table authorities (
    username varchar(50) not null,
    authority varchar(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 persistent_logins (
    username varchar(64) not null,
    series varchar(64) primary key,
    token varchar(64) not null,
    last_used timestamp not null
);

users にレコード追加


password は SHA256 で暗号化、標準で
パスワード{ユーザ名}
例)pass{s6131}
を暗号化するので、ユーザ登録処理を自前で作るまでは、オンラインハッシュジェネレータ等で上記のハッシュを取得して指定する。
(大文字の場合、全て小文字に変換して登録する。)
username password enabled
s6131 da205f3776042925d23bd7d0ca4aae55bc4e17ef245743d5ab5e6c267a9b8504 1

autorities にレコード追加


username authority
s6131 ROLE_ADMIN
s6131 ROLE_USER

persistent_logins は Remember Me にチェックが入っていれば自動的にレコード作成する。

web.xml に追加

<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>

root-context.xml に追加


<bean id="myUserDetailsService" class="org.springframework.security.core.userdetails.jdbc.JdbcDaoImpl">
    <property name="dataSource" ref="dataSource"/>
</bean>
<sec:authentication-manager>
    <sec:authentication-provider user-service-ref='myUserDetailsService'>
        <sec:password-encoder hash="sha-256">
            <sec:salt-source user-property="username"/>
        </sec:password-encoder>
    </sec:authentication-provider>
</sec:authentication-manager>
<sec:http auto-config="true">
    <sec:intercept-url pattern="/login*" access="ROLE_ANONYMOUS" />
    <sec:intercept-url pattern="/**" access="ROLE_USER" />
    <sec:form-login login-page="/login" default-target-url="/" authentication-failure-url="/login?error=true" />
    <sec:logout logout-url="/logout" logout-success-url="/login" />
    <sec:remember-me data-source-ref="dataSource"/>
</sec:http>

src/main/java/jp/s6131/sample/controller/HomeController.java に追加


@RequestMapping(value = "/login", method = RequestMethod.GET)
public String login(HttpServletRequest req, Locale locale, Model model) {
return "login";
}

src/main/webapp/WEB-INF/views/login.jsp を作成


<html>
    <head>
        <title>Login</title>
    </head>
    <body>
        <form action="j_spring_security_check" method="post">
            <p>
                UserName :
                <input type="text" required="true" autofocus="true" name="j_username" />
            </p>
            <p>
                Password :
                <input type="password" required="true" name="j_password" />
            </p>
            <p>
                Remember Me :
                <input type="checkbox" name="_spring_security_remember_me" />
            </p>
            <button type="submit" name="login">Login</button>
        </form>
    </body>
</html>


人気ブログランキングへ