Spring Security基本配置方法解析
Spring Security是一个强大的安全框架,主要用于保护我们的Web应用程序。在本文中,我们将讨论如何使用Spring Security来保护Web应用程序。
添加Spring Security依赖
Spring Security需要添加以下依赖:
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-web</artifactId>
<version>5.2.1.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-config</artifactId>
<version>5.2.1.RELEASE</version>
</dependency>
配置Spring Security
在Spring Security中配置应用程序的安全性,需要创建一个配置文件SecurityConfig.java,在其中定义安全文档,包括身份验证和授权规则。
配置Spring Security的基本设置
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
auth.inMemoryAuthentication()
.withUser("user").password("{noop}password").roles("USER");
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.antMatchers("/admin/**").hasRole("ADMIN")
.anyRequest().authenticated()
.and()
.formLogin()
.and()
.logout().logoutSuccessUrl("/login");
}
}
在上面的代码中,我们定义了一个Spring Security的配置类SecurityConfig,并继承了WebSecurityConfigurerAdapter类。我们还使用@EnableWebSecurity注释来启用Spring Security Web Security。
在configureGlobal()方法中,我们创建了一个内存用户,用户名为user,密码为password,角色为USER。
在configure()方法中,我们定义了授权规则。对于地址为“/admin/**”的请求,只有拥有ADMIN角色的用户才能访问。对于所有其他请求,用户必须进行身份验证。我们还定义了表单登录和注销。
使用数据库作为身份验证存储
我们也可以使用数据库作为身份验证存储。这里我们可以使用Spring Data JPA和Hibernate。
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
private DataSource dataSource;
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.jdbcAuthentication().dataSource(dataSource)
.usersByUsernameQuery("select username, password, enabled"
+ " from users where username=?")
.authoritiesByUsernameQuery("select username, authority "
+ "from authorities where username=?");
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.antMatchers("/admin/**").hasRole("ADMIN")
.anyRequest().authenticated()
.and()
.formLogin()
.and()
.logout().logoutSuccessUrl("/login");
}
}
在上面的代码中,我们使用了DataSource来配置JDBC身份验证,同时使用了usersByUsernameQuery和authoritiesByUsernameQuery指定了需要查询的用户及权限信息的语句。
示例
示例1:保护Spring Boot应用程序
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
@Override
public void addViewControllers(ViewControllerRegistry registry) {
registry.addViewController("/login").setViewName("login");
registry.addViewController("/admin").setViewName("admin");
registry.setOrder(Ordered.HIGHEST_PRECEDENCE);
}
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
}
在上面的代码中,我们创建了一个Spring Boot应用程序,并定义了WebMvcConfig配置类。
在WebMvcConfig中,我们使用了PasswordEncoder定义了密码加密算法。
示例2:保护Spring MVC应用程序
@Controller
public class HomeController {
@GetMapping("/")
public String home() {
return "Home";
}
@GetMapping("/about")
public String about() {
return "About";
}
@GetMapping("/admin")
public String admin() {
return "Admin";
}
}
<bean id="viewResolver"
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix">
<value>/WEB-INF/views/</value>
</property>
<property name="suffix">
<value>.jsp</value>
</property>
</bean>
<security:http auto-config="true">
<security:intercept-url pattern="/admin/**" access="ROLE_ADMIN" />
<security:form-login login-page="/login" default-target-url="/"
authentication-failure-url="/login?error" />
<security:logout logout-success-url="/login" />
</security:http>
<security:authentication-manager>
<security:authentication-provider>
<security:user-service>
<security:user name="user" password="password" authorities="ROLE_USER" />
<security:user name="admin" password="password" authorities="ROLE_ADMIN" />
</security:user-service>
</security:authentication-provider>
</security:authentication-manager>
在上面的代码中,我们创建了一个Spring MVC应用程序,并定义了HomeController。
在HomeController中,我们定义了映射到“/admin”页面的GET请求。
在Spring Security配置文件中,我们使用了http和authentication-manager定义了HTTP拦截器和身份验证管理器。对于地址为“/admin/**”的请求,只有拥有ADMIN角色的用户才能访问。我们还定义了表单登录和注销。
结论
本文中我们讨论了如何使用Spring Security来保护Web应用程序。我们涵盖了Spring Security的基本设置和配置方法,并提供了两个示例来演示如何保护Spring Boot和Spring MVC应用程序。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Spring Security基本配置方法解析 - Python技术站