Spring Security如何使用JAVA代码进行配置呢?

Java-教程王 SpringSecurity 发布时间:2021-08-09 10:48:40 阅读数:19105 1
下文讲述Spring Security框架中使用纯Java代码配置Spring Security的方法分享:
实现思路:
  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命名空间的相同之处
  1. HttpSecurity和http命名空间类似。它可以对于某一部分请求进行特别配置。要看个完整的配置实例,详见SampleMultiHttpSecurityConfig
  2. WebSecurity和Security的命名空间的元素很类似,后者是针对web的,不需要父节点(security=none, debug等等)。可以对整个web security进行配置
  3. WebSecurityConfigurerAdapter方便我们定制WebSecurity和HttpSecurity。我们可以对WebSecurityConfigurerAdapter进行多次继承,以实现不同的http行为。详细的实例参见SampleMultiHttpSecurityConfig
  4. 我们以上的Java配置代码作了代码格式化,所以易于阅读。“and()”类似于XML中结束一个元素的结束符
Java配置和XML命名空间的不同之处
  1. 当你在”#1″和“#2”中创建用户的时候,我们并没有设置为”ROLE_“前缀,而我们在XML设置成了“ROLE_USER”。因为这是个管理,”roles()”方法会自动添加”ROLE_“。如果你不想要”ROLE_“,你可以使用”authoritites()”方法
  2. Java配置有一些不同的默认URL和参数。当要创建自定义的登陆页面的时候要将这一条牢记在心。默认的URL使我们的URL更加RESTful。另外,使用Spring Security可以帮我避免信息泄露)。例如:
  3. GET访问/login登陆页面,而不是访问/spring_security_login
  4. POST访问/login,而不是/j_spring_security_check
  5. 用户名默认为parameter,而不是j_username
  6. 密码默认是password,而不是j_password
  7. Java配置可以更容易将多个请求映射到同样的角色上。#4就将两个URL作了映射,以便所有人都可以访问
  8. Java移除了多余的代码。例如,在XML中我们不得不在form-login和intercept-url中重复两次”/login”,而在Java配置中,我们靠#5就轻易做到了让用户都能访问到和formLogin()相关的URL
  9. 映射HTTP请求的时候,我们使用了“hasRole()”方法,我们也没有添加”ROLE_”前缀,而在XML中我们则添加了。这也是我们应该知道的惯例:”hasRole()”会自动添加”ROLE_”前缀。如果你不想要“ROLE_”前缀,你可以使用”access()”方法
版权声明

本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。

本文链接: https://www.Java265.com/JavaFramework/SpringSecurity/202108/648.html

最近发表

热门文章

好文推荐

Java265.com

https://www.java265.com

站长统计|粤ICP备14097017号-3

Powered By Java265.com信息维护小组

使用手机扫描二维码

关注我们看更多资讯

java爱好者