Spring Security学習——Java注解に基づくSpring Security配置


Java注解によるSpring Security構成
 
        Springは初期バージョンの時、xmlのプロファイルに基づいていますので、構成が非常に煩雑です.後期バージョンでは、SpringはJava注釈に基づくサポートを提供しています.Java注解のSpringは、各Bean類に自己構成の特性を持たせ、各クラスに対応するJava注解を追加することにより、これらの種類のシステムにおける機能を表示することができ、構成ファイルの管理を大幅に低減することができる.もちろん、Java注解のSpringにもいくつかの欠点があります.例えば、注釈を使ってSpringを配置すると、Springの配置能力が失われます.Java注解はコンパイルされますので、コンパイル後に変更したいならば、ソースコードを修正してもう一度オンラインをコンパイルしなければなりません.Springプロファイルを使用すれば、配置ファイルの内容を直接修正することができます.Springフレームは自動的に再読み込みして配置し、熱い展開を実現します.
      以下は完全に注釈に基づくSpringです. MVC+Spring Securityプロジェクトはweb.xmlには何の設定もありません.午前と午後の二時間を整えて、やっと分かりました.やはりスピリットをよく知るべきです. MVCの内部原理と底部実現、Spring MVCスターターは、AbstractAnnotationConfigDisplatServletInitializerクラスを継承し、get Root ConfigClass()メソッドにWebMvcConfigrer Adapterを継承した実装クラスを追加し、getServletMappings()メソッドにSpringを配置します. MVCはブロックが必要です.要求経路の正規表現です.WebMvcConfigrer Adapter実装クラスでは、私たちが普段mvc-dispatcher.xmlファイルに配置しているいくつかのbeanオブジェクトを定義することができます.Springを起動します Securityは自分でAbstract Security WebApple Initializerのサブクラスを実現する必要があります.もしSpringに基づくならば MVCの項目は空で実現できます.でないと、空の構造方法で父の構造方法を呼び出して、自分のSpringに入る必要があります. Security配置類は、WebSecurityConfigrer Adapterのカスタムクラスを継承したもので、カスタマイズしたWebSecurityConfigrer Adapterのサブクラスは、spring-security.xmlファイルに相当します.WebSecurityConfigrer Adapter.co.nfigreGlobal(Authentication ManagerBuider auth)メソッドでは、Spring Securityユーザの情報データソースを設定することができます.ここでauth.userDetails Serviceを呼び出します.このようにプロジェクトを実行して、検証フォームを提出した後に、いつも404を提示しています.つまり、提出したユーザ情報フォームを処理するプロセッサがなくて、検証ができません.これも長い間私を抑えていた問題です.stack overflowでやっと解決方法が見つかりました.この時、formLoginにloginProcessigUrlを追加する必要があります.xmlに基づいてSpringを配置します. Securityの時はこの問題が発生していませんでしたが、今はまだ迷っています.
    Sprng MVCのスターターは名前を見れば分かりますが、具体的にはどのようにカスタムクラスを達成すればSpring MVCの起動が可能ですか?
package security.controller;

import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;

public class MvcWebApplicationInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {

	@Override
	protected Class>[] getRootConfigClasses() {
		return new Class[] { WebConfig.class };
	}

	@Override
	protected Class>[] getServletConfigClasses() {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	protected String[] getServletMappings() {
		return new String[] { "/" };
	}

}
ソースコードを見ました.AbstractAnnotationConfigDisplatServletInitializer類はAbstracted DisplatDisplatInitiazer類に継承されています.このフレームワークはAbstract Displact SertInitiazerクラスにあります.この方法の実現は以下の通りです.
String servletName = getServletName();
		Assert.hasLength(servletName, "getServletName() may not return empty or null");

		WebApplicationContext servletAppContext = createServletApplicationContext();
		Assert.notNull(servletAppContext,
				"createServletApplicationContext() did not return an application " +
				"context for servlet [" + servletName + "]");

		DispatcherServlet dispatcherServlet = new DispatcherServlet(servletAppContext);
		ServletRegistration.Dynamic registration = servletContext.addServlet(servletName, dispatcherServlet);
		Assert.notNull(registration,
				"Failed to register servlet with name '" + servletName + "'." +
				"Check if there is another servlet registered under the same name.");

		registration.setLoadOnStartup(1);
		registration.addMapping(getServletMappings());
		registration.setAsyncSupported(isAsyncSupported());

		Filter[] filters = getServletFilters();
		if (!ObjectUtils.isEmpty(filters)) {
			for (Filter filter : filters) {
				registerServletFilter(servletContext, filter);
			}
		}

		customizeRegistration(registration);
では、内部newがDisplatch Servletオブジェクトを見られます.これはSpring MVCから提供された、xml構成に基づくSpringです. MVCはよくこの種類を使います.web.xmlに配置されている、すなわちSpringです. MVCのブロッキング経路の要求はこの種類のオブジェクトによって受信されます.更にDispactch Servletを見るとFrame ewark Servletに継承されていますが、Frame ewelkServletはHttpServletBenに継承されています.最後にHttpServletに継承されています.OK、分かりました.Spring MVCの内部原理は一つのServletをカスタマイズして、このServletに複数の要求をブロックさせて、Springを通して MVC内部の配布Mapperは異なるControllerにマッピングされます.このように見たらSpringとSpringです. MCもそうではないです
不思議です.これらはすべてServlet 3の特性に基づいている.開発環境がServlet 3に対応していないと、カスタムSpringは使えません. MVCスターターがSpringを自動起動します. MVCのです
更にSpring MVCの配置類の具体的な実現を見ます.
package security.controller;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
import org.springframework.web.servlet.view.InternalResourceViewResolver;
import org.springframework.web.servlet.view.JstlView;

@Configuration
@EnableWebMvc
@ComponentScan(basePackages = { "security.controller" })
@Import(SecurityConfig.class)
public class WebConfig extends WebMvcConfigurerAdapter {

	@Bean
	public InternalResourceViewResolver resolver() {
		InternalResourceViewResolver resolver = new InternalResourceViewResolver();
		resolver.setViewClass(JstlView.class);
		resolver.setPrefix("/WEB-INF/pages/");
		resolver.setSuffix(".jsp");
		return resolver;
	}

}
   クラス名の上のいくつかの注釈もよく理解できます.表示は構成類で、WebMVCをサポートします.コンポーネントスキャンパッケージ「security.co ntroller」はmvc-dispacher.xmlファイルと同等です.この方法に@Bean注釈を追加しました.この方法はInternalResource VieResolisoverオブジェクトを生産すると表しています.この方法の実現はmvc-dispatcher.xmlファイルに配置されたものに相当します.

	  
		/WEB-INF/pages/
	  
	  
		.jsp
	  
	
は、Springがxmlファイル構成のモードを設定しているため、Springコンテキストが起動したときに対応するxmlプロファイルを解析し、対応するクラスパス上のオブジェクトを生成し、対応するオブジェクト間の関係処理を行う、これもSpringベースのリアルモードである.WebConfigクラス名に添付されている@Import("SecurityConfig.class)の注釈は、Spring Securityの配置情報をSpringに追加するという意味です. MVCのコンテキストでは、このプロジェクトはSpringです. MVCとスピリット Securityを統合し、SpringはSpringを管理します. Securityのオブジェクトと要求マップ.
それから本題Springです. Securityの配置類
package security.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
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.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

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

	@Override
	protected void configure(HttpSecurity http) throws Exception {
		http.authorizeRequests().antMatchers("/dba**").access("hasRole('ROLE_DBA')").antMatchers("/user**")
				.access("hasRole('ROLE_USER')").and().formLogin().loginProcessingUrl("/j_spring_security_check").loginPage("/login").failureUrl("/login?error")
				.usernameParameter("username").passwordParameter("password")
				.successHandler(new AuthoritySuccessHandler()).and().csrf().and().logout()
				.logoutSuccessUrl("/login?logout");
	}

}
このクラスはspring-security.xmlの設定ファイルと等価です.configre(Http Security http)の方法で分かりやすいです.loginProcessigUrlを追加します.これは長い間です.
そしてSpringです. Securityのコンフィギュレーション
package security.controller;

import org.springframework.security.web.context.AbstractSecurityWebApplicationInitializer;

public class WebSecurityInitializer extends AbstractSecurityWebApplicationInitializer {
	
}
このプロジェクトはSpringに基づいているからです. MVCですので、空で実現できます.ソースを見ると、Abstract SecurityWebApplizerがWebApple Initiazerインターフェースを実現し、Abstract Security Webporation Initializerの実現において、WebApplizerのオンストップ方法を実現したとき、ServblitiazerにEventを追加しました.このクラスはHttpSession Listenerモニターを実現しています.Java Web開発に詳しい人は、このモニターがHttpSessionのライフサイクルをモニターできることを知っています.Sessionが作成されると、クライアントが最初に要求した時にセッションオブジェクト、つまりHttpSessionオブジェクトを作成します. イベント方法は、この方法でget Contect(event.get Session).getServlet Conteet().publishEvent(e);この呼び出しの下にSpringの起動プロセスが必ず実行されていることが想像できます.ここまでは、Spring、Spring MVC、Springも終わりました. Securityの自動起動の原理.xmlベースのファイル構成では、Spring SecurityはServletフィルタに基づいて、Abstract Security WebApple plication Initializerのオンストップメソッドの実現を見て、最後から2行目にinservletContectを呼び出しました.方法、更にinsertSprigSecurityFilterCharinを見ます;方法の実現により、Delegating FilterProxyのオブジェクトが作成されていることが分かりました.このクラスを見ても非常に熟知しています.このクラスはweb.xmlファイルに配置されているSpringです. SecurityのフィルターFilter.方法の最後の行で、register Filter(servlet Contect)を呼び出しました.true、filterName、sprigSecurityFilterChin).方法は、この方法の実現において、このDelegating FilterProxyオブジェクトをServlet Contectコンテキストに動的に追加したに違いないと考えられます.
private final void registerFilter(ServletContext servletContext, boolean insertBeforeOtherFilters, String filterName, Filter filter) {
        Dynamic registration = servletContext.addFilter(filterName, filter);
        if(registration == null) {
            throw new IllegalStateException("Duplicate Filter registration for '" + filterName +"'. Check to ensure the Filter is only configured once.");
        }
        registration.setAsyncSupported(isAsyncSecuritySupported());
        EnumSet dispatcherTypes = getSecurityDispatcherTypes();
        registration.addMappingForUrlPatterns(dispatcherTypes, !insertBeforeOtherFilters, "/*");
    }
、フィルタブロッキングの経路も/*、これはweb.xmlファイルに設定されているのと同じです.
         このようにプロジェクト全体の配置に成功しました.運行には何の問題もなく、xmlファイルの構成と同じ効果があります.プロジェクト全体にはxmlファイルの設定がありません.web.xmlファイルですか?それともeclipseプロジェクトを作成する時に自動的に生成されたものですか?少しも修正されていません.ここでSpring生態系の設計がとても不思議で素晴らしいと感嘆しなければなりません.ソースコードを見てから不思議というほどではないと思いますが、Springフレームの設計に感心しなければならないです.複雑な過程をこのように簡略化してください.
       また、Java注解配置の利点に基づいて、配置が終わったら、各クラスの役割を注釈で説明しました.このように各クラスは自叙述性を持っています.これは一つのプロジェクトの開発にとって極めて重要です.もし一つのプロジェクトが100以上のxml配置ファイルがあると、どれぐらいの恐ろしい状況になるかは想像できません.