1. 程式人生 > >java B2B2C Springcloud電子商務平臺原始碼-security簡單使用

java B2B2C Springcloud電子商務平臺原始碼-security簡單使用

security的簡單原理:
需要JAVA Spring Cloud大型企業分散式微服務雲構建的B2B2C電子商務平臺原始碼:壹零叄八柒柒肆六二六

使用眾多的攔截器對url攔截,以此來管理許可權。但是這麼多攔截器,不可能對其一一來講,主要講裡面核心流程的兩個。

首先,許可權管理離不開登陸驗證的,所以登陸驗證攔截器AuthenticationProcessingFilter要講;還有就是對訪問的資源管理吧,所以資源管理攔截器AbstractSecurityInterceptor要講;但攔截器裡面的實現需要一些元件來實現,所以就有了AuthenticationManager、accessDecisionManager等元件來支撐。

現在先大概過一遍整個流程,使用者登陸,會被AuthenticationProcessingFilter攔截,呼叫AuthenticationManager的實現,而且AuthenticationManager會呼叫ProviderManager來獲取使用者驗證資訊(不同的Provider呼叫的服務不同,因為這些資訊可以是在資料庫上,可以是在LDAP伺服器上,可以是xml配置檔案上等),如果驗證通過後會將使用者的許可權資訊封裝一個User放到spring的全域性快取SecurityContextHolder中,以備後面訪問資源時使用。

訪問資源(即授權管理),訪問url時,會通過AbstractSecurityInterceptor攔截器攔截,其中會呼叫FilterInvocationSecurityMetadataSource的方法來獲取被攔截url所需的全部許可權,在呼叫授權管理器AccessDecisionManager,這個授權管理器會通過spring的全域性快取SecurityContextHolder獲取使用者的許可權資訊,還會獲取被攔截的url和被攔截url所需的全部許可權,然後根據所配的策略(有:一票決定,一票否定,少數服從多數等),如果許可權足夠,則返回,許可權不夠則報錯並呼叫許可權不足頁面。

雖然講得好像好複雜,讀者們可能有點暈,不過不打緊,真正通過程式碼的講解在後面,讀者可以看完後面的程式碼實現,再返回看這個簡單的原理,可能會有不錯的收穫。

在spring boot中使用security
首先匯入spring security的包:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-security</artifactId>
</dependency>

在spring security中有一個非常重要的配置類需要編寫
就是繼承這個抽象類WebSecurityConfigurerAdapter,如下程式碼所示
這個bean的目的是將我們的使用者存到記憶體中,這個用於除錯還是可以的,但是我們開發中是不存在這樣的

@Bean
        @Override
        protected UserDetailsService userDetailsService(){
            InMemoryUserDetailsManager manager = new InMemoryUserDetailsManager();
            manager.createUser(User.withUsername("user_1").password("123456").authorities("USER").build());
            manager.createUser(User.withUsername("user_2").password("123456").authorities("USER").build());
            return manager;
        }

上面這步完成後還需要我們將userdetail的類給新增到攔截器中,因為我們登入是需要進行驗證使用者的,所以可以直接

  @Autowired
        public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
            auth.userDetailsService(userDetailsService);
        }

這裡面還可以設定其他引數,比如加密的方式以及其他等等。
在這個類中海可以設定一寫忽略的攔截類,即不需要進行驗證的

/** 
* 忽略設定的介面 
*/

@Override
  public void configure(WebSecurity web) throws Exception {
    String ignoring = env.getProperty("msi.auth.ignoring","/health|/info");
    web.ignoring().antMatchers(ignoring.split("\\|"));
  }

不管是使用哪種方式,將使用者存到記憶體或者存到資料庫操作,都需要將操作放到

  @Autowired
        public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
            auth.userDetailsService(userDetailsService);
        }

java B2B2C springmvc mybatis電子商務平臺原始碼