Permalink
Browse files

suppl01: ユーザ認証(アカウント情報をデータベースに保存、パスワードをハッシュ化)、管理者ページ

  • Loading branch information...
teachingprogramming committed Jul 25, 2017
1 parent c503827 commit 300bd6d0e5e0c000315088ccfc573c8146ccbed1
@@ -2,24 +2,32 @@
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
@Configuration
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {
@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
// アカウントの設定
public void configureGlobal(AuthenticationManagerBuilder auth, JdbcTemplate jdbcTemplate) throws Exception {
// アカウントの設定(ハードコード)
auth.inMemoryAuthentication().withUser("admin").password("adminpassword").roles("ADMIN");
auth.inMemoryAuthentication().withUser("user1").password("user1password").roles("USER");
// アカウントの設定(データベース)、利用するパスワードエンコーダの設定
PasswordEncoder passwordEncoder = new BCryptPasswordEncoder();
auth.jdbcAuthentication().dataSource(jdbcTemplate.getDataSource()).passwordEncoder(passwordEncoder);
}
@Override
protected void configure(HttpSecurity http) throws Exception {
// 「/suppl01/secret/**」は認証が必要で、それ以外は認証が不要
http.authorizeRequests().antMatchers("/suppl01/secret/**").authenticated().anyRequest().permitAll();
http.authorizeRequests()
.antMatchers("/suppl01/secret/**").authenticated() // 「/suppl01/secret/**」は認証が必要(ロールは問わず)
.antMatchers("/suppl01/admin/**").hasRole("ADMIN") // 「/suppl01/admin/**」は管理者ロールが必要
.anyRequest().permitAll(); // それ以外は認証が不要
// ログイン
http.formLogin().loginPage("/suppl01/login").usernameParameter("username").passwordParameter("password")
@@ -1,16 +1,32 @@
package net.teachingprogramming.webapp;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.security.core.annotation.AuthenticationPrincipal;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
@Controller
@RequestMapping("/suppl01")
public class Suppl01Controller {
private final JdbcTemplate jdbcTemplate;
/**
* Suppl01Controllerのコンストラクタ
*/
@Autowired
public Suppl01Controller(JdbcTemplate jdbcTemplate) {
this.jdbcTemplate = jdbcTemplate;
}
/**
* トップページ
*/
@@ -44,4 +60,34 @@ public String secretInfo(@AuthenticationPrincipal UserDetails userDetails, Model
return "suppl01/secret/info";
}
/**
* 管理者用トップページ
*/
@GetMapping("/admin/")
public String adminIndex() {
return "suppl01/admin/index";
}
/**
* ユーザの追加(GET、フォームを表示)
*/
@GetMapping("/admin/add_user")
public String adminAddUserGet() {
return "suppl01/admin/add_user";
}
/**
* ユーザの追加(POST、データベースを操作)
*/
@PostMapping("/admin/add_user")
public String adminAddUserPost(@RequestParam("username") String username,
@RequestParam("password") String password,
@RequestParam("role") String role) {
PasswordEncoder passwordEncoder = new BCryptPasswordEncoder();
jdbcTemplate.update("INSERT INTO users ( username, password , enabled ) VALUES (?, ?, ?)", username, passwordEncoder.encode(password), true);
jdbcTemplate.update("INSERT INTO authorities ( username, authority) VALUES (?, ?)", username, role);
return "redirect:/suppl01/admin/";
}
}
@@ -0,0 +1,12 @@
create table IF NOT EXISTS users (
username varchar_ignorecase(50) not null primary key,
password varchar_ignorecase(100) not null,
enabled boolean not null
);
create table IF NOT EXISTS 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 IF NOT EXISTS ix_auth_username on authorities (username,authority);
@@ -0,0 +1,26 @@
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8"/>
<title>Secret</title>
</head>
<body>
<h1>Suppl01</h1>
<h2>Admin: ユーザを追加</h2>
<form th:action="@{add_user}" method="post">
ユーザ名: <input name="username" /><br/>
パスワード: <input name="password" type="password"/><br/>
ロール: <select name="role"><option value="ROLE_USER">一般ユーザ</option><option value="ROLE_ADMIN">管理者</option></select><br/>
<button type="submit">追加</button>
</form>
<ul>
<li><a href="/suppl01/admin/">戻る</a></li>
</ul>
<form th:action="@{/suppl01/logout}" method="post">
<button type="submit">ログアウト</button>
</form>
</body>
</html>
@@ -0,0 +1,22 @@
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8"/>
<title>Secret</title>
</head>
<body>
<h1>Suppl01</h1>
<h2>Admin</h2>
<p>
このページは、管理者が見られるページです。
</p>
<ul>
<li><a href="add_user">ユーザを追加</a></li>
</ul>
<form th:action="@{/suppl01/logout}" method="post">
<button type="submit">ログアウト</button>
</form>
</body>
</html>
@@ -12,6 +12,7 @@ <h2>Secret</h2>
</p>
<ul>
<li><a href="info">アカウント情報を表示</a></li>
<li><a href="../admin/">管理者ページへ</a></li>
</ul>
<form th:action="@{/suppl01/logout}" method="post">

0 comments on commit 300bd6d

Please sign in to comment.