Security 自定义 登陆页面,这个只是一个简单的Demo 只是为了学习,因为只有熟悉了相关的API 你才会更加知道怎么玩这个东西,然后结合源码看看其实就那么几个东西,
新建项目新建一个springboot 项目,相关的依赖这里就不贴出来了. 就 web.和 security 那些
POMpom,这里的依赖只是添加了 jsp 相关的 需要再加上 springboot 和 security 相关的jar 包
io.jsonwebtoken jjwt 0.9.1 javax.servlet javax.servlet-api provided javax.servlet jstl org.apache.tomcat.embed tomcat-embed-jasper provided
将webapp 的资源 copy 到 meta/resources 目录下否则访问不到…
建立目录src/main/webapp meta-INF/resources **** org.springframework.boot spring-boot-maven-plugin 2.3.7.RELEASE
建立目录 webapp.WEB-INF.views
将页面建在 views 目录下
<%@ page contentType="text/html;charset=utf-8" pageEncoding="utf-8" %>
用户登录
IDEA配置
按下 快捷Shift+Ctrl+Alt+S 弹出以下窗口
启动类@SpringBootApplication
public class SecunityLoginApplication {
public static void main(String[] args) {
SpringApplication s = new SpringApplication(SecunityLoginApplication.class);
s.setBannerMode(Banner.Mode.OFF); //会取消spring启动标识
s.setAddCommandLineProperties(false); //禁止命令行明细
s.setAdditionalProfiles(SecurityConfig.getProfile()); //激活 配置文件为 dev的配置
s.run(args);
}
}
定义controller
@RestController
@RequestMapping("test")
public class TestController {
@RequestMapping("test")
public String test() {
return "需要权限才能访问";
}
}
//------------这是另外的controller-------------
@RestController
@RequestMapping
public class SuccessController {
@RequestMapping("defaultSuccessUrl")
public String defaultSuccessUrl() {
return "defaultSuccessUrl登陆成功";
}
@RequestMapping("successForwardUrl")
public String test() {
return "successForwardUrl登陆成功";
}
}
配置
以下配置都是API的测试… 每一个类都是单独的例子…通过配置类去设置启动的配置文件
配置文件@Configuration
public class SecurityConfig {
public static String getProfile() {
// return LoginPageSecurityConfig.class.getSimpleName(); // 自定义登陆页面
// return LoginProcessingUrlSecurityConfig.class.getSimpleName();// 自定义登陆接口和请求参数
// return SuccessUrlSecuritySuccess.class.getSimpleName(); // 登陆成功跳转的URL
// return SuccessHandlerSecuritySuccess.class.getSimpleName(); //登陆成功 Handler
return LoginErrorSecurityConfig.class.getSimpleName(); //登陆失败案例
}
}
自定义登陆没权限 页面的返回
@Profile("LoginErrorSecurityConfig")
@EnableWebSecurity // 开启WebSecurity
public class LoginErrorSecurityConfig extends WebSecurityConfigurerAdapter implements WebMvcConfigurer {
//重写参数为HttpSecurity的configure方法,配置拦截策略
@Override
protected void configure(HttpSecurity http) throws Exception {
//屏蔽CSRF控制,即spring security不再限制CSRF
http.csrf().disable()
.authorizeRequests()
.antMatchers("/test/**").authenticated() // 对其进行拦截
.anyRequest().permitAll() // 所有的请求都放行
.and()
//表单登陆
.formLogin()
// 自定义登陆页面,默认是 /login
.loginPage("/login-view")//登录页面
// 用户如果在验证之前访问过安全页面,则在验证成功后用户将被重定向到该访问页面,不然就会跳转到默认的配置的页面
// .defaultSuccessUrl("/test/test")
.successForwardUrl("/defaultSuccessUrl")
.and()
.exceptionHandling()
// 默认的会跳转到登陆页面,也就是说访问未授权的页面的会话
.authenticationEntryPoint((req, resp, authException) -> {
resp.setContentType("application/json;charset=utf-8");
PrintWriter out = resp.getWriter();
out.write("尚未登录,请先登录");
out.flush();
out.close();
}
)
;
}
@Bean
public InternalResourceViewResolver viewResolver() {
InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
viewResolver.setPrefix("/WEB-INF/views/");
viewResolver.setSuffix(".jsp");
// 这个属性通常并不需要手 动配置,高版本的Spring会自动检测
// viewResolver.setViewClass(JstlView.class);
return viewResolver;
}
//默认Url根路径跳转到/login,此url为spring security提供
@Override
public void addViewControllers(ViewControllerRegistry registry) {
// 这里为了演示才这么做跳转的
registry.addViewController("/").setViewName("redirect:/login-view");
// 当IDEA 配置完后是能进行跳转到 login的
registry.addViewController("/login*").setViewName("login");
}
}
loginPage
@Profile("LoginPageSecurityConfig")
@EnableWebSecurity // 开启WebSecurity
public class LoginPageSecurityConfig extends WebSecurityConfigurerAdapter implements WebMvcConfigurer {
//重写参数为HttpSecurity的configure方法,配置拦截策略
@Override
protected void configure(HttpSecurity http) throws Exception {
//屏蔽CSRF控制,即spring security不再限制CSRF
http.csrf().disable()
.authorizeRequests()
.antMatchers("/test/**").authenticated() // 对其进行拦截
.anyRequest().permitAll() // 所有的请求都放行
.and()
//表单登陆
.formLogin()
// 自定义登陆页面,默认是 /login
.loginPage("/login-view")//登录页面
;
}
@Bean
public InternalResourceViewResolver viewResolver() {
InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
viewResolver.setPrefix("/WEB-INF/views/");
viewResolver.setSuffix(".jsp");
// 这个属性通常并不需要手 动配置,高版本的Spring会自动检测
// viewResolver.setViewClass(JstlView.class);
return viewResolver;
}
//默认Url根路径跳转到/login,此url为spring security提供
@Override
public void addViewControllers(ViewControllerRegistry registry) {
// 这里为了演示才这么做跳转的
registry.addViewController("/").setViewName("redirect:/login-view");
// 当IDEA 配置完后是能进行跳转到 login的
registry.addViewController("/login-view").setViewName("login");
}
}
自定义登陆接口和请求参数
@Profile("LoginProcessingUrlSecurityConfig")
@EnableWebSecurity // 开启WebSecurity
public class LoginProcessingUrlSecurityConfig extends WebSecurityConfigurerAdapter implements WebMvcConfigurer {
//重写参数为HttpSecurity的configure方法,配置拦截策略
@Override
protected void configure(HttpSecurity http) throws Exception {
//屏蔽CSRF控制,即spring security不再限制CSRF
http.csrf().disable()
.authorizeRequests()
.antMatchers("/test/**").authenticated() // 对其进行拦截
.anyRequest().permitAll() // 所有的请求都放行
.and()
//表单登陆
.formLogin()
// 自定义登陆页面,默认是 /login
.loginPage("/LoginProcessingUrlSecurityConfig")//登录页面
.loginProcessingUrl("/LoginProcessingUrlSecurityConfig-login-action")
.usernameParameter("un")
.passwordParameter("pw")
.successForwardUrl("/test/test")
;
}
@Bean
public InternalResourceViewResolver viewResolver() {
InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
viewResolver.setPrefix("/WEB-INF/views/");
viewResolver.setSuffix(".jsp");
// 这个属性通常并不需要手 动配置,高版本的Spring会自动检测
// viewResolver.setViewClass(JstlView.class);
return viewResolver;
}
//默认Url根路径跳转到/login,此url为spring security提供
@Override
public void addViewControllers(ViewControllerRegistry registry) {
registry.addViewController("/").setViewName("/LoginProcessingUrlSecurityConfig");
registry.addViewController("/LoginProcessingUrlSecurityConfig").setViewName("/LoginProcessingUrlSecurityConfig");
}
}
对应的JSP
<%@ page contentType="text/html;charset=utf-8" pageEncoding="utf-8" %>
用户登录
自定义成功的 Handler
@Profile("SuccessHandlerSecuritySuccess")
@EnableWebSecurity // 开启WebSecurity
public class SuccessHandlerSecuritySuccess extends WebSecurityConfigurerAdapter implements WebMvcConfigurer {
//重写参数为HttpSecurity的configure方法,配置拦截策略
@Override
protected void configure(HttpSecurity http) throws Exception {
//屏蔽CSRF控制,即spring security不再限制CSRF
http.csrf().disable()
.authorizeRequests()
.antMatchers("/test/**").authenticated() // 对其进行拦截
.anyRequest().permitAll() // 所有的请求都放行
.and()
//表单登陆
.formLogin()
// 自定义登陆页面,默认是
.loginPage("/login-view")//登录页面
// 用户如果在验证之前访问过安全页面,则在验证成功后用户将被重定向到该访问页面,不然就会跳转到默认的配置的页面
// .defaultSuccessUrl("/test/test")
.successHandler((request, response, authentication) -> {
response.setContentType("application/json");
PrintWriter out = response.getWriter();
Map map = new HashMap<>();
map.put("status", 200);
map.put("msg", authentication.getPrincipal());
// 浏览器返回json数据
out.write(new ObjectMapper().writevalueAsString(map));
out.flush();
out.close();
})
;
}
@Bean
public InternalResourceViewResolver viewResolver() {
InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
viewResolver.setPrefix("/WEB-INF/views/");
viewResolver.setSuffix(".jsp");
// 这个属性通常并不需要手 动配置,高版本的Spring会自动检测
// viewResolver.setViewClass(JstlView.class);
return viewResolver;
}
//默认Url根路径跳转到/login,此url为spring security提供
@Override
public void addViewControllers(ViewControllerRegistry registry) {
// 这里为了演示才这么做跳转的
registry.addViewController("/").setViewName("redirect:/login-view");
// 当IDEA 配置完后是能进行跳转到 login的
registry.addViewController("/login*").setViewName("login");
}
}
自定义成功的URL
@Profile("SuccessUrlSecuritySuccess")
@EnableWebSecurity // 开启WebSecurity
public class SuccessUrlSecuritySuccess extends WebSecurityConfigurerAdapter implements WebMvcConfigurer {
//重写参数为HttpSecurity的configure方法,配置拦截策略
@Override
protected void configure(HttpSecurity http) throws Exception {
//屏蔽CSRF控制,即spring security不再限制CSRF
http.csrf().disable()
.authorizeRequests()
.antMatchers("/test/**").authenticated() // 对其进行拦截
.anyRequest().permitAll() // 所有的请求都放行
.and()
//表单登陆
.formLogin()
// 自定义登陆页面,默认是 /login
.loginPage("/login-view")//登录页面
// 用户如果在验证之前访问过安全页面,则在验证成功后用户将被重定向到该访问页面,不然就会跳转到默认的配置的页面
// .defaultSuccessUrl("/test/test")
.successForwardUrl("/test/test")
;
}
@Bean
public InternalResourceViewResolver viewResolver() {
InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
viewResolver.setPrefix("/WEB-INF/views/");
viewResolver.setSuffix(".jsp");
// 这个属性通常并不需要手 动配置,高版本的Spring会自动检测
// viewResolver.setViewClass(JstlView.class);
return viewResolver;
}
//默认Url根路径跳转到/login,此url为spring security提供
@Override
public void addViewControllers(ViewControllerRegistry registry) {
// 这里为了演示才这么做跳转的
registry.addViewController("/").setViewName("redirect:/login-view");
// 当IDEA 配置完后是能进行跳转到 login的
registry.addViewController("/login-view").setViewName("login");
}
}
访问页面
127.0.0.1:8080 访问即可…
后言我按照这个步骤从新跑了一个新的Demo 是没问题… 如有问题留言…



