Spring Security如何使用JAVA代码进行配置呢?
下文讲述Spring Security框架中使用纯Java代码配置Spring Security的方法分享:
如下例所示:
在ApplicationContext上下文中定义HelloWebSecurityConfiguration
实现思路: 1.添加依赖信息: 如Maven中添加相应的jar包 2.进行Spring Security配置:此处采用WebSecurityConfigurerAdapter 3.确保Spring Security配置已经被加载了:此处采用AbstractAnnotationConfigDispatcherServletInitializer 4.配置springSecurityFilterChain:此处采用AbstractSecurityWebApplicationInitializer
WebSecurityConfigurerAdapter
@EnableWebSecurity注解结合WebSecurityConfigurerAdapter可实现web的security如下例所示:
1.设置用户进入所有页面(url)都需进行相应的验证操作 2.设置一个用户名及密码及角色 3.设置HTTP Basic及表单验证 4.Spring Security框架将会自动生成一个登陆页面和登出成功页面
@Configuration @EnableWebSecurity public class HelloWebSecurityConfiguration extends WebSecurityConfigurerAdapter { @Override protected void registerAuthentication(AuthenticationManagerBuilder auth) { auth.inMemoryAuthentication() .withUser("userName").password("password").roles("USERRole"); } }以上代码所对应的xml配置信息如下所示:
<http use-expressions="true"> <intercept-url pattern="/**" access="authenticated"/> <logout logout-success-url="/login?logout" logout-url="/logout" /> <form-login authentication-failure-url="/login?error" login-page="/login" login-processing-url="/login" password-parameter="password" username-parameter="username" /> </http> <authentication-manager> <authentication-provider> <user-service> <user name="userName" password="password" authorities="USERRole"/> </user-service> </authentication-provider> </authentication-manager>
AbstractAnnotationConfigDispatcherServletInitializer
AbstractAnnotationConfigDispatcherServletInitializer的功能:在ApplicationContext上下文中定义HelloWebSecurityConfiguration
public class SpringWebMvcInitializer extends AbstractAnnotationConfigDispatcherServletInitializer { @Override protected Class[] getRootConfigClasses() { return new Class[] { HelloWebSecurityConfiguration.class }; } ... }所对应的xml信息通常如下所示:
<!-- Creates the Spring Container shared by all Servlets and Filters --> <listener> <listener-class> org.springframework.web.context.ContextLoaderListener </listener-class> </listener> <!-- Load all Spring XML configuration including our security.xml file --> <context-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/spring/*.xml</param-value> </context-param>
AbstractSecurity WebApplicationInitializer
AbstractSecurity WebApplicationInitializer定义映射路径public class SecurityWebApplicationInitializer extends AbstractSecurityWebApplicationInitializer { }以上代码对应的xml配置如下:
<filter> <filter-name>springSecurityFilterChain</filter-name> <filter-class> org.springframework.web.filter.DelegatingFilterProxy </filter-class> </filter> <filter-mapping> <filter-name>springSecurityFilterChain</filter-name> <url-pattern>/*</url-pattern> <dispatcher>ERROR</dispatcher> <dispatcher>REQUEST</dispatcher> </filter-mapping>
例:hello Spring Security配置
@EnableWebSecurity @Configuration public class CustomWebSecurityConfigurerAdapter extends WebSecurityConfigurerAdapter { @Override protected void registerAuthentication(AuthenticationManagerBuilder auth) { auth .inMemoryAuthentication() .withUser("userName") // #1 .password("password") .roles("USERRole") .and() .withUser("admin") // #2 .password("password") .roles("ADMINRole","USERRole"); } @Override public void configure(WebSecurity web) throws Exception { web .ignoring() .antMatchers("/resources/**"); // #3 } @Override protected void configure(HttpSecurity http) throws Exception { http .authorizeUrls() .antMatchers("/signup","/about").permitAll() // #4 .antMatchers("/admin/**").hasRole("ADMIN") // #6 .anyRequest().authenticated() // #7 .and() .formLogin() // #8 .loginUrl("/login") // #9 .permitAll(); // #5 } }以上代码的功能:
1.可以在内存中的验证(memory authentication)叫作”userName”的用户 2.可以在内存中的验证(memory authentication)叫作”admin”的管理员用户 3.忽略任何以”/resources/”开头的请求,这和在XML配置http@security=none的效果一样 4.任何人(包括没有经过验证的)都可以访问”/signup”和”/about” 5.任何人(包括没有经过验证的)都可以访问”/login”和”/login?error”。permitAll()是指用户可以访问formLogin()相关的任何URL。 6.“/admin/”开头的URL必须要是管理员用户,如”admin”用户 7.所有其他的URL都需要用户进行验证 8.使用Java配置默认值设置了基于表单的验证。使用POST提交到”/login”时,需要用”username”和”password”进行验证。 9.注明了登陆页面,意味着用GET访问”/login”时,显示登陆页面
XML配置和Java代码配置说明
Java配置和XML命名空间的相同之处
- HttpSecurity和http命名空间类似。它可以对于某一部分请求进行特别配置。要看个完整的配置实例,详见SampleMultiHttpSecurityConfig
- WebSecurity和Security的命名空间的元素很类似,后者是针对web的,不需要父节点(security=none, debug等等)。可以对整个web security进行配置
- WebSecurityConfigurerAdapter方便我们定制WebSecurity和HttpSecurity。我们可以对WebSecurityConfigurerAdapter进行多次继承,以实现不同的http行为。详细的实例参见SampleMultiHttpSecurityConfig
- 我们以上的Java配置代码作了代码格式化,所以易于阅读。“and()”类似于XML中结束一个元素的结束符
Java配置和XML命名空间的不同之处
- 当你在”#1″和“#2”中创建用户的时候,我们并没有设置为”ROLE_“前缀,而我们在XML设置成了“ROLE_USER”。因为这是个管理,”roles()”方法会自动添加”ROLE_“。如果你不想要”ROLE_“,你可以使用”authoritites()”方法
- Java配置有一些不同的默认URL和参数。当要创建自定义的登陆页面的时候要将这一条牢记在心。默认的URL使我们的URL更加RESTful。另外,使用Spring Security可以帮我避免信息泄露)。例如:
- GET访问/login登陆页面,而不是访问/spring_security_login
- POST访问/login,而不是/j_spring_security_check
- 用户名默认为parameter,而不是j_username
- 密码默认是password,而不是j_password
- Java配置可以更容易将多个请求映射到同样的角色上。#4就将两个URL作了映射,以便所有人都可以访问
- Java移除了多余的代码。例如,在XML中我们不得不在form-login和intercept-url中重复两次”/login”,而在Java配置中,我们靠#5就轻易做到了让用户都能访问到和formLogin()相关的URL
- 映射HTTP请求的时候,我们使用了“hasRole()”方法,我们也没有添加”ROLE_”前缀,而在XML中我们则添加了。这也是我们应该知道的惯例:”hasRole()”会自动添加”ROLE_”前缀。如果你不想要“ROLE_”前缀,你可以使用”access()”方法
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。