Spring Security____クイックスタート(ログイン、パスワード暗号化などの機能)

15216 ワード

一、Spring Security紹介
         Spring Securityの前身はAcegi Securityであり、Springプロジェクトグループでセキュリティ認証サービスを提供するためのフレームワークである.(https://projects.spring.io/spring-security/Spring SecurityはJ 2 EEベースのエンタープライズアプリケーションに包括的なセキュリティサービスを提供しています.特に、最先端のJ 2 EEソリューション-SPringフレームワークを用いて開発されたエンタープライズソフトウェアプロジェクト.Spring Securityの使用には多くの理由がありますが、一般的に注目されているのはJ 2 EEサーブレット仕様やEJB仕様では典型的なエンタープライズアプリケーションシーンが見つからないソリューションです.特に、WARレベルやEARレベルで移植できないことを指摘します.このように、サーバ環境を変更する場合は、新しいターゲット環境で多くの作業を行い、アプリケーションシステムのセキュリティを再構成する必要があります.Spring Securityを使用してこれらの問題を解決し、他のセキュリティ機能を完全に指定できる多くの有用な機能を提供します.セキュリティには、2つの主要な操作が含まれます.
     ○「認証」は、ユーザが宣言した主体を作成するものである.トピックは一般的に、ユーザー、デバイス、またはあなたのシステムで動作を実行できる他のシステムを指します.
     ○「授権」とは、ユーザーがアプリケーションで操作を実行できるかどうかを意味し、授権判断に達する前に、アイデンティティのトピックが認証プロセスによって確立されていることを意味します.
        これらの概念は一般的でSpring Security特有のものではない.認証の面では、Spring Securityは様々な認証モデルを広くサポートしており、これらの検証モデルのほとんどはサードパーティが提供しているか、インターネットEngineering Task Forceなどの開発中の標準機関が提供している.補足として、Spring Securityも独自の検証機能を提供している.Spring Securityは現在、認証一体化をサポートしている.HTTP BASIC authentication headers(IEFTRFCベースの標準)HTTP Digest authentication headers(IEFTRFCベースの標準)HTTP X.509 client certificate exchange(IEFTRFCベースの標準)LDAP(プラットフォーム間認証の一般的なアプローチ、特に大環境では)Form-based authentication(シンプルなユーザーインタフェースのニーズを提供する)OpenID authentication Computer Associates Siteminder JA-SIG Central Authentication Service(CAS、これはポピュラーなオープンソース単一ログインシステム)Transparent authentication context propagation for Remote Method Invocation and HttpInvoker(Springリモートコールプロトコル)
二、導入依存
  
    5.0.2.RELEASE
    5.0.1.RELEASE
  

  
    
    
      org.springframework.security
      spring-security-web
      ${spring.security.version}
    
    
      org.springframework.security
      spring-security-config
      ${spring.security.version}
    

    
      org.springframework
      spring-core
      ${spring.version}
    
    
      org.springframework
      spring-web
      ${spring.version}
    
    
      org.springframework
      spring-webmvc
      ${spring.version}
    
    
      org.springframework
      spring-context-support
      ${spring.version}
    
    
      org.springframework
      spring-test
      ${spring.version}
    
    
      org.springframework
      spring-jdbc
      ${spring.version}
    
    
      javax.servlet
      javax.servlet-api
      3.1.0
      provided
    
  

三、web.xmlファイルにfilterを作成する
  
    org.springframework.web.context.ContextLoaderListener
  
  
    contextConfigLocation
    classpath:spring-security.xml
  
  
    springSecurityFilterChain
    org.springframework.web.filter.DelegatingFilterProxy
  
  
    springSecurityFilterChain
    /*
  

四、spring securityコアプロファイル構成(spring-security.xml)
 


    
    

    
    

    
    
    
        
            
                
                
            
        
    



五、カスタムページ構成
1、インポート依存、web.xml構成は上記と同じ
2、spring-security.xmの構成



    
    
    
    
    
    

    
    
        
        

        
        

        
        

        
        

    

    
    
        
            
        
    

    
    

    


3、UserServiceインタフェースの作成
package com.xiong.service;

import org.springframework.security.core.userdetails.UserDetailsService;

public interface UserService extends UserDetailsService {
}

3、UserServiceImplの実現

@Service("userService")
@Transactional
public class UserServiceImpl implements UserService {

    @Autowired
    @Qualifier("userDao")
    private UserDao userDao;

    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        UserInfo userInfo = null;
        try {
            userInfo = userDao.findByUsername(username);
        } catch (Exception e) {
            e.printStackTrace();
        }
        //          UserDetails
        //User user = new User(userInfo.getUsername(), "{noop}" + userInfo.getPassword(), getAuthority(userInfo.getRoles()));
        User user = new User(userInfo.getUsername(), "{noop}" + userInfo.getPassword(), 
                userInfo.getStatus() == 0 ? false : true, true, true, true, getAuthority(userInfo.getRoles()));
        return user;
    }

    //        list  ,            
    public List getAuthority(List roles) {
        List list = new ArrayList();
        for (Role role : roles) {
            list.add(new SimpleGrantedAuthority("ROLE_" + role.getRoleName()));
        }
        list.add(new SimpleGrantedAuthority("ROLE_USER"));
        return list;
    }
}

4、UserDaoを実装してuserテーブルを検索する
package com.xiong.dao;

import com.xiong.domain.UserInfo;
import org.apache.ibatis.annotations.Many;
import org.apache.ibatis.annotations.Result;
import org.apache.ibatis.annotations.Results;
import org.apache.ibatis.annotations.Select;
import org.springframework.stereotype.Repository;

@Repository("userDao")
public interface UserDao {

    @Select("select * from users where username=#{username}")
    @Results({
            @Result(id = true, property = "id", column = "id"),
            @Result(property = "email", column = "email"),
            @Result(property = "username", column = "username"),
            @Result(property = "password", column = "password"),
            @Result(property = "phoneNum", column = "phoneNum"),
            @Result(property = "status", column = "status"),
            @Result(property = "roles", column = "id", javaType = java.util.List.class,
                    many = @Many(select = "com.xiong.dao.RoleDao.findById"))

    })
    public UserInfo findByUsername(String username);
}

RoleDao
package com.xiong.dao;

import com.xiong.domain.Role;
import org.apache.ibatis.annotations.Select;

public interface RoleDao {

    @Select("select * from role where id in (select roleId from users_role where userId = #{userId})")
    public Role findById(String userId);
}

5、エンティティークラスの省略
六、暗号化
1、パスワードの暗号化
@Service("userService")
@Transactional
public class UserServiceImpl implements IUserService {

    @Autowired
    private IUserDao userDao;

    @Autowired
    private BCryptPasswordEncoder passwordEncoder;
    
    public void save(UserInfo userInfo) throws Exception {
        userInfo.setPassword(passwordEncoder.encode(userInfo.getPassword()));
        userDao.save(userInfo);
    }
}

2、パスワードの解読
UserServiceImpl.java
{noop}を削除し、{noop}コードは復号化ログインを使用しません

@Service("userService")
@Transactional
public class UserServiceImpl implements IUserService {

    @Autowired
    private IUserDao userDao;

    @Autowired
    private BCryptPasswordEncoder passwordEncoder;

    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        UserInfo userInfo = null;
        try {
            userInfo = userDao.findByUsername(username);
        } catch (Exception e) {
            e.printStackTrace();
        }
        //          UserDetails
        //User user = new User(userInfo.getUsername(), "{noop}" + userInfo.getPassword(), getAuthority(userInfo.getRoles()));
        User user = new User(userInfo.getUsername(), userInfo.getPassword(), userInfo.getStatus() == 0 ? false : true, true, true, true, getAuthority(userInfo.getRoles()));
        return user;
    }

    //        list  ,            
    public List getAuthority(List roles) {
        List list = new ArrayList();
        for (Role role : roles) {
            list.add(new SimpleGrantedAuthority("ROLE_" + role.getRoleName()));
        }
        list.add(new SimpleGrantedAuthority("ROLE_USER"));
        return list;
    }

    /**
     *   
     * @param userInfo
     * @throws Exception
     */
    public void save(UserInfo userInfo) throws Exception {
        userInfo.setPassword(passwordEncoder.encode(userInfo.getPassword()));
        userDao.save(userInfo);
    }
}

spring-security.xml