spring-boot - 我想首先查看登录页面,即使任何用户想要访问任何其他页面都需要在 Spring Security 中重定向到登录页面
问题描述
这是示例控制器。我的问题基本上是当我输入基本网址时,它重定向到内页而不是登录页面。我想要的是。我应该怎么做才能做到这一点。
这是示例控制器。我的问题基本上是当我输入基本网址时,它重定向到内页而不是登录页面。我想要的是。我应该怎么做才能做到这一点。
package com.sushovan.security.controller;
import javax.validation.groups.ConvertGroup;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class HomeController {
@RequestMapping("/")
public String home() {
return "home.jsp";
}
@RequestMapping("/login")
public String loginPage() {
return "login.jsp";
}
@RequestMapping("/logout-success")
public String logoutPage() {
return "logout.jsp";
}
}
这是示例安全配置类。几乎所有配置都在这里完成。
package com.sushovan.security.config;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.authentication.AuthenticationProvider;
import org.springframework.security.authentication.dao.DaoAuthenticationProvider;
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;
import org.springframework.security.core.userdetails.User;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.NoOpPasswordEncoder;
import org.springframework.security.provisioning.InMemoryUserDetailsManager;
import org.springframework.security.web.util.matcher.AntPathRequestMatcher;
import org.springframework.util.AntPathMatcher;
@Configuration
@EnableWebSecurity
public class AppSecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
private UserDetailsService userDetailsService;
/**This is for authentication from database**/
@Bean
public AuthenticationProvider authProvider() {
DaoAuthenticationProvider provider = new DaoAuthenticationProvider();
provider.setUserDetailsService(userDetailsService);
//provider.setPasswordEncoder(NoOpPasswordEncoder.getInstance());//This is for not use any encryption
provider.setPasswordEncoder(new BCryptPasswordEncoder());//This is for BCryptPasswordEncoder
return provider;
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http.csrf().disable();
http.authorizeRequests().antMatchers("/login")
.permitAll()
.and()
.formLogin()
.loginPage("/login")
.usernameParameter("userName").passwordParameter("password")
.permitAll()
.and()
.logout().invalidateHttpSession(true)
.clearAuthentication(true)
.logoutRequestMatcher(new AntPathRequestMatcher("/logout"))
.logoutSuccessUrl("/logout-success").permitAll();
}
}
解决方案
Spring 安全过滤器算法是这样工作的;网络资源受保护吗?用户认证了吗?用户是否授权?
因此,如果未通过身份验证,它将请求重定向到登录页面,这就是您想要的。
所以你应该更新你的配置方法
@Override
protected void configure(HttpSecurity http) throws Exception {
http.csrf().disable();
http.authorizeRequests()
.anyRequest().authenticated()
.and()
.formLogin()
.loginPage("/login")
.usernameParameter("userName").passwordParameter("password")
.permitAll()
.and()
.logout().invalidateHttpSession(true)
.clearAuthentication(true)
.logoutRequestMatcher(new AntPathRequestMatcher("/logout"))
.logoutSuccessUrl("/logout-success").permitAll();
}
你能试试这个,让我知道它是否有效吗?
推荐阅读
- azure-devops - 在 ftp 中添加或修改文件时从 Ftp 复制到 azure blob
- qt - QT 中的未知模块:webengine webenginewidgets
- react-native - 在 Drawer Navigator 3.0 中单击项目菜单时如何重置屏幕
- java - 过滤大字符串
- ruby-on-rails - 如何使用 url_for 生成路由中不存在的路径
- java - 使用 JAXB-API 导致 ClassNotFoundException 的 parallelStream()
- ios - 如何在 Xcode 中导入 Firebase
- java - 避免在组件值更改时执行事件
- python - 如何用两种不同的颜色绘制一条曲线?(不使用熊猫)
- ruby-on-rails - 语言环境在 Rails 中的暂存时无法正常工作?