如何为 spring 引导项目配置 spring 安全性
how to configure spring security for spring boot project
我正在尝试制作一个使用以下内容的网络应用程序:
Spring启动,
Mysql,
JDBC
, MVC, 道
百里香叶,
IntelliJ
我正试图弄清楚 Spring 安全性是如何工作的(我在这方面遇到了很多困难)。
我的观点整理如下:
resources(folder): - ________static(folder)
|____templates(folder):__________images(folder)
|___userOnly(folder):_____header.html
| |__help.html
| |__menu.html
| |__newDocForm.html
| |__profil.html
|
|__firstPage.html
|__header.html
|__home.html
|__index.html
|__inscriptionForm.html
|__loginPage.html
我希望身份不明的用户可以访问除“userOnly”中包含的视图之外的所有视图,并且我的“loginPage”页面用作登录页面。
如果我理解正确,我必须创建一个继承自“WebSecurityConfigurerAdapter”的class。
我做了什么。
然后配置“配置”,我不能正确地做:(
@Configuration
@EnableWebSecurity
public class SecSecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(final HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/userOnly/**").hasRole("USER")
.anyRequest().authenticated()
.and()
.formLogin()
.loginPage("/loginPage.html");
}
}
抱歉,如果我的问题看起来很奇怪,但英语不是我的第一语言
你需要告诉 Spring 安全 URL 是什么 public 像这样 -
@Configuration
@EnableWebSecurity
public class SecSecurityConfig extends WebSecurityConfigurerAdapter {
private static final String[] PUBLIC_URLS = {"/public/*"};
@Override
protected void configure(final HttpSecurity http) throws Exception {
http.authorizeRequests()
.antMatchers("/userOnly/**").hasRole("USER")
.anyRequest().authenticated()
.and()
.formLogin()
.loginPage("/loginPage.html");
}
@Override
public void configure(WebSecurity web) {
List<RequestMatcher> matchers =
Arrays.asList(urls).stream().map(url -> new
AntPathRequestMatcher(url)).collect(Collectors.toList());
web.ignoring().requestMatchers(new OrRequestMatcher(matchers));
}
}
使用 OrRequestMatcher ,您可以创建您需要 public 的所有 URL 的列表。
您还可以使用 NegatedRequestMatcher 来获取所有私有 URL
RequestMatcher privateUrlMatcher = new
NegatedRequestMatcher(publicUrlMatcher);
我还建议您将所有 public url 保留在 /src/main/resources/static/publicui 下,将所有 /src/main/resources/static/privateui 下的私有化并获得 public 对 /[=24 的许可=]ui/*
在您的 SecSecurityConfig 中尝试以下操作 class
@Configuration
@EnableAutoConfiguration
@EnableWebSecurity
public class SecSecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.antMatchers("/users").authenticated()
.anyRequest().permitAll()
.and()
.formLogin()
.usernameParameter("email")
.defaultSuccessUrl("/lib/allBooks")
.permitAll()
.and()
.logout().logoutSuccessUrl("/lib").permitAll();
http
.csrf().disable();
}
}
只需修改为您的应用程序设置的参数。如果您没有登录表单,您可以跳过
.usernameParameter("email")
.defaultSuccessUrl("/lib/allBooks")
.permitAll()
从 Spring-Boot 2.7 开始,不推荐使用 WebSecurityConfigurerAdapter
。如果您使用的是 spring-boot 2.6 或更早版本,其他答案可能更适合。
据我所知,在 Spring-Boot 2.7 中定义安全配置的推荐方法如下:
@Configuration
public class WebSecurityConfig
{
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception
{
// @formatter:off
http.authorizeRequests()
.mvcMatchers("/userOnly/**").permitAll()
.anyRequest().permitAll();
http.formLogin()
.permitAll()
.loginPage("/loginPage.html");
http.logout()
.permitAll();
// @formatter:on
return http.build();
}
}
我认为不推荐在 voucher_wolves
的答案中使用 web.ignoring(),而是应该将这些情况添加到 http.mvcMatcher().permitAll()
。
在旁注中,如果您忘记为 link 添加安全性,我个人会推荐将 public 页面列入白名单并向其他所有内容添加身份验证(例如 public 文件夹)默认情况下不是 public。
我正在尝试制作一个使用以下内容的网络应用程序: Spring启动, Mysql, JDBC , MVC, 道 百里香叶, IntelliJ
我正试图弄清楚 Spring 安全性是如何工作的(我在这方面遇到了很多困难)。 我的观点整理如下:
resources(folder): - ________static(folder)
|____templates(folder):__________images(folder)
|___userOnly(folder):_____header.html
| |__help.html
| |__menu.html
| |__newDocForm.html
| |__profil.html
|
|__firstPage.html
|__header.html
|__home.html
|__index.html
|__inscriptionForm.html
|__loginPage.html
我希望身份不明的用户可以访问除“userOnly”中包含的视图之外的所有视图,并且我的“loginPage”页面用作登录页面。
如果我理解正确,我必须创建一个继承自“WebSecurityConfigurerAdapter”的class。 我做了什么。 然后配置“配置”,我不能正确地做:(
@Configuration
@EnableWebSecurity
public class SecSecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(final HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/userOnly/**").hasRole("USER")
.anyRequest().authenticated()
.and()
.formLogin()
.loginPage("/loginPage.html");
}
}
抱歉,如果我的问题看起来很奇怪,但英语不是我的第一语言
你需要告诉 Spring 安全 URL 是什么 public 像这样 -
@Configuration
@EnableWebSecurity
public class SecSecurityConfig extends WebSecurityConfigurerAdapter {
private static final String[] PUBLIC_URLS = {"/public/*"};
@Override
protected void configure(final HttpSecurity http) throws Exception {
http.authorizeRequests()
.antMatchers("/userOnly/**").hasRole("USER")
.anyRequest().authenticated()
.and()
.formLogin()
.loginPage("/loginPage.html");
}
@Override
public void configure(WebSecurity web) {
List<RequestMatcher> matchers =
Arrays.asList(urls).stream().map(url -> new
AntPathRequestMatcher(url)).collect(Collectors.toList());
web.ignoring().requestMatchers(new OrRequestMatcher(matchers));
}
}
使用 OrRequestMatcher ,您可以创建您需要 public 的所有 URL 的列表。 您还可以使用 NegatedRequestMatcher 来获取所有私有 URL
RequestMatcher privateUrlMatcher = new
NegatedRequestMatcher(publicUrlMatcher);
我还建议您将所有 public url 保留在 /src/main/resources/static/publicui 下,将所有 /src/main/resources/static/privateui 下的私有化并获得 public 对 /[=24 的许可=]ui/*
在您的 SecSecurityConfig 中尝试以下操作 class
@Configuration
@EnableAutoConfiguration
@EnableWebSecurity
public class SecSecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.antMatchers("/users").authenticated()
.anyRequest().permitAll()
.and()
.formLogin()
.usernameParameter("email")
.defaultSuccessUrl("/lib/allBooks")
.permitAll()
.and()
.logout().logoutSuccessUrl("/lib").permitAll();
http
.csrf().disable();
}
}
只需修改为您的应用程序设置的参数。如果您没有登录表单,您可以跳过
.usernameParameter("email")
.defaultSuccessUrl("/lib/allBooks")
.permitAll()
从 Spring-Boot 2.7 开始,不推荐使用 WebSecurityConfigurerAdapter
。如果您使用的是 spring-boot 2.6 或更早版本,其他答案可能更适合。
据我所知,在 Spring-Boot 2.7 中定义安全配置的推荐方法如下:
@Configuration
public class WebSecurityConfig
{
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception
{
// @formatter:off
http.authorizeRequests()
.mvcMatchers("/userOnly/**").permitAll()
.anyRequest().permitAll();
http.formLogin()
.permitAll()
.loginPage("/loginPage.html");
http.logout()
.permitAll();
// @formatter:on
return http.build();
}
}
我认为不推荐在 voucher_wolves
的答案中使用 web.ignoring(),而是应该将这些情况添加到 http.mvcMatcher().permitAll()
。
在旁注中,如果您忘记为 link 添加安全性,我个人会推荐将 public 页面列入白名单并向其他所有内容添加身份验证(例如 public 文件夹)默认情况下不是 public。