1. ホーム
  2. データベース
  3. mssql2008

ログインとパーミッションのロール制御のためのSpringセキュリティ

2022-01-20 01:02:40

 はじめに

  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(",")) {