ログインとパーミッションのロール制御のためのSpringセキュリティ
はじめに
1、springのバージョン。4.3.2.RELEASE + springセキュリティバージョン。4.1.2.RELEASE(その他は未記載)
2、アノテーション構成で表示される全てのコンテンツ
3、springmvcが設定されている、説明しない。
4、springmvc、spel、elのものが含まれます、不慣れな学生は、特に、最初にこのコンテンツを見に行くことができますspringmvcの
まず、ログインに必要なものを考えます。一番簡単なケースは、ユーザー名、パスワード、そしてデータベースと比較し、一致すれば個人ページに飛び、そうでなければランディングページに戻り、ユーザー名パスワードエラーのプロンプトが表示されます。このプロセスは、パーミッションロールと一緒に、セッション中も行われる必要があります。このことを考えると、データベースのユーザー名とパスワードをspring securityに渡して比較させ、関連するジャンプはsecurityに任せ、permission roleとユーザー名をセッション中に配置するのをsecurityに手伝わせるだけで良いのです。
ディレクトリ
準備
ランディングページ
個人ページ
Springセキュリティの設定開始
1. スプリングセキュリティの開始
2. パーミッションの設定
3. UserDetailServiceの記述
まず、データベースのテーブルを用意する
CREATE TABLE `user` (
`username` varchar(255) NOT NULL,
`password` char(255) NOT NULL,
`roles` enum('MEMBER','MEMBER,LEADER','SUPER_ADMIN') NOT NULL DEFAULT 'MEMBER',
PRIMARY KEY (`username`),
KEY `username` (`username`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
PS:ここでロールの内容に注意してください、LEADERもMEMBERです、そうして、LEADERはMEMBER権限を持つことになります、もちろん、アプリケーション内部の判断をすることもできます、これについては後述します。
ランディングページ
<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ taglib prefix="sf" uri="http://www.springframework.org/tags/form"%>
<html>
<head>
<title>login</title>
</head>
<body>
<div >
<sf:form action="${pageContext.request.contextPath}/log" method="POST" commandName="user"> <! -- spring form tag for model binding and automatically add hidden CSRF token tag -- >
<h1 >login</h1>
<c:if test="${error==true}"><p style="color: red">Wrong account or password</p></c:if> <! -- Failed login will show this -->
<c:if test="${logout==true}"><p >Logged out of login</p></c:if> <! -- Logging out of the login will show this -- >
<sf:input path="username" name="user.username" placeholder="Enter account" /><br />
<sf:password path="password" name="user.password" placeholder="Enter password" /><br />
<input id="remember-me" name="remember-me" type="checkbox"/> <! -- checkbox for remember-me function -->
<label for="remember-me">Remember me in a week</label>
<input type="submit" class="sumbit" value="submit" >
</sf:form>
</div>
</body>
</html>
個人ページ
<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false"%>
<%@taglib prefix="security" uri="http://www.springframework.org/security/tags" %>
<%@ taglib prefix="sf" uri="http://www.springframework.org/tags/form"%>
<html>
<head>
<title> Welcome,<security:authentication property="principal.username" var="username"/>${username}</ title> <! -- The successful login will show the name, here var saves the user name to the username variable, the following can be obtained by EL -- >
</head>
<body>
<security:authorize access="isAuthenticated()"><h3>Login successful! ${username}</h3></security:authorize> <! -- login success will show the name -->
<security:authorize access="hasRole('MEMBER')"> <! -- The MENBER role will then display the contents of the security:authorize tag -- >
<p>You are MENBER</p>
</security:authorize>
<security:authorize access="hasRole('LEADER')">
<p>You are LEADER</p>
</security:authorize>
<sf:form id="logoutForm" action="${pageContext.request.contextPath}/logout" method="post"> <! -- Logout button, note that here is post, get is will logout failure -- >
<a href="#" onclick="document.getElementById('logoutForm').submit();">logout</a>
</sf:form>
</body>
</html>
Springセキュリティの設定開始
1. 春のセキュリティ開始
@Order(2)
public class WebSecurityAppInit extends AbstractSecurityWebApplicationInitializer{
}
AbstractSecurityWebApplicationInitializerを継承し、春のセキュリティが自動的に準備作業を実施し、ここで@Order(2)は、エラーの開始と一緒に私はspringmvc(また、純粋なアノテーション構成)と春のセキュリティ前に、私は何を忘れて具体的には、問題を避けることができた後にセキュリティを開始させるにはこれを追加し、あなたが書いていない場合@Order(2)ないエラー、気にしないことです。
2. パーミッションの設定
@Configuration
@EnableWebSecurity
@ComponentScan("com.chuanzhi.workspace.service.impl.*")
public class WebSecurityConfig extends WebSecurityConfigurerAdapter{
@Autowired
private UserDetailService userDetailService; //if userDetailService is not scanned then add the @ComponentScan
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.antMatchers("/me").hasAnyRole("MEMBER","SUPER_ADMIN")//personal home page only allows users with the MENBER,SUPER_ADMIN role to access
.anyRequest().authenticated()
.and()
.formLogin()
.loginPage("/").permitAll() //here the default path is the login page, allowing everyone to log in
.loginProcessingUrl("/log") //login submission processing url
.failureForwardUrl("/?error=true") //login failed to forward, here back to the landing page, the parameter error can tell the landing status
.defaultSuccessUrl("/me") //login success url, here go to the personal home page
.and()
.logout().logoutUrl("/logout").permitAll().logoutSuccessUrl("/?logout=true") //in order, the first is the logout url, security will intercept this url so we do not need to implement the logout, the second is the logout url, logout to inform the login status
.and()
.rememberMe()
.tokenValiditySeconds(604800) //rememberMe function, cookie expiration date is one week
.rememberMeParameter("remember-me") //Whether to activate the remember me function when logging in the parameter name, in the landing page there is a display
.rememberMeCookieName("workspace"); //name of the cookie, you can view the cookie name through your browser after login
}
@Override
public void configure(WebSecurity web) throws Exception {
super.configure(web);
}
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.userDetailsService(userDetailService); //configure custom userDetailService
}
}
3. UserDetailService を書く
春のセキュリティは、主にセキュリティにユーザーを確認するための情報を提供するために、ユーザーの情報を取得するサービスを提供し、ここで我々は自分のニーズをカスタマイズすることができます、私はこれがユーザーの情報を取得するデータベースからユーザー名に基づいており、その後のフォローアップ処理のためのセキュリティになります。
@Service(value = "userDetailService")
public class UserDetailService implements UserDetailsService {
@Autowired
private UserRepository repository;
public UserDetailService(UserRepository userRepository){
this.repository = userRepository; // user repository, not described here
}
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
User user = repository.findUserByUsername(username);
if (user==null)
throw new UsernameNotFoundException("The account information could not be found! "); //throw exception, will jump to the login failure page according to the configuration
List<GrantedAuthority> list = new ArrayList<GrantedAuthority>(); //GrantedAuthority is the permission class provided by security
getRoles(user,list); //get the roles and put them inside the list
org.springframework.security.core.userdetails.User auth_user = new
User(user.getUsername(),user.getPassword(),list); //return the User including the permission role to security
return auth_user;
}
/**
* Get the role to which the user belongs
* @param user
* @param list
* public void getRoles(User user,List<GrantedAuthority> list){
for (String role:user.getRoles().split(",")) {
関連
-
SQLServer 2008は、評価期間が終了したソリューションであることを確認しました。
-
SQL Server 2008のオープン入力のSAパスワードプロンプトは、データベースソリューションにログインすることはできません
-
jdomで中国語のxmlファイルを作成する方法
-
SQL server 2008のログイン認証方式を変更する方法
-
SQL server 2008で変更を保存できない場合の完璧な解決策(図解入り)
-
What to do if sql server can't connect SQL Server 2008R can't login solution (181418456)
-
Sql Server 2008データベースで新しい割り当てユーザーを作成する詳細な手順
-
sql server 2008データベース移行の2つの方法
-
SQL2008 復元 SQL2005 バックアップファイル 不成功の解決法
-
sql server 2008のインストールに失敗したときの解決策 旧バージョンを完全にアンインストールしてください。
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
SQL Server 2008 データベース分散クエリの知識
-
SQL Server 2008でSQLクエリ文のフィールド値の大文字と小文字が区別されない問題の解決
-
についてSQL Server 2008は、SAパスワードを忘れて、SAパスワードのメソッドのダイアグラムを変更する
-
SQL Server 2008r2 データベースサービスにおける各種起動不能の解決方法 (詳細)
-
SQLにおけるpatindex関数の使用方法を詳しく説明します。
-
sqlserver2008 初回ログイン失敗の問題と解決策
-
解決 SQL Server 2008は、". "ローカルローカル接続データベースを使用することはできません問題
-
SQL Server 2008 R2 データベースミラーリング導入マニュアル(デュアルコンピュータ) SQL Server 2014 も適用可能です。
-
SQLServerウェブサイト構築例
-
Sql Server 2008R2アップグレード Sql Server 2012グラフィックチュートリアル