Security-相关自定义学习

前言

Security 自定义 登陆页面,这个只是一个简单的Demo 只是为了学习,因为只有熟悉了相关的API 你才会更加知道怎么玩这个东西,然后结合源码看看其实就那么几个东西,

新建项目

新建一个springboot 项目,相关的依赖这里就不贴出来了. 就 web.和 security 那些

POM

pom,这里的依赖只是添加了 jsp 相关的 需要再加上 springboot 和 security 相关的jar 包

<!-- jwt -->
<dependency>
    <groupId>io.jsonwebtoken</groupId>
    <artifactId>jjwt</artifactId>
    <version>0.9.1</version>
</dependency>
<!--     以下是jsp依赖-->
<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>javax.servlet-api</artifactId>
    <scope>provided</scope>
</dependency>
<!--  jsp页面使用jstl标签 -->
<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>jstl</artifactId>
</dependency>
<!--  用于编辑JSP-->
<dependency>
    <groupId>org.apache.tomcat.embed</groupId>
    <artifactId>tomcat-embed-jasper</artifactId>
    <scope>provided</scope>
</dependency>

将webapp 的资源 copy 到 META/resources 目录下否则访问不到…

  <build>
        <resources>
            <resource>
                <!-- 指定处理哪个目录下的资源文件 -->
                <directory>src/main/webapp</directory>
                <!-- 目标路径-->
                <targetPath>META-INF/resources</targetPath>
                <includes>
                    <include>**/**</include>
                </includes>
            </resource>
            <resource>
                <directory>src/main/resources</directory>
                <filtering>true</filtering>
                <includes>
                    <include>**/**</include>
                </includes>
            </resource>
        </resources>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <version>2.3.7.RELEASE</version>
            </plugin>
        </plugins>
    </build>

建立目录

建立目录 webapp.WEB-INF.views
image-20211010140145956
将页面建在 views 目录下

<%@ page contentType="text/html;charset=utf-8" pageEncoding="utf-8" %>
<html>
<head>
    <title>用户登录</title>
</head>
<body>
<form action="login" method="get">
    用户名:<input type="text" name="username"><br>&nbsp;&nbsp;&nbsp;码:
    <input type="password" name="password"><br>
    <input type="submit" value="登录">
</form>
</body>
</html>

IDEA配置

按下 快捷Shift+Ctrl+Alt+S 弹出以下窗口

image-20211009182653894

启动类

@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")//登录页面
                .loginProcessingUrl("/login")
                // 用户如果在验证之前访问过安全页面,则在验证成功后用户将被重定向到该访问页面,不然就会跳转到默认的配置的页面
                .defaultSuccessUrl("/defaultSuccessUrl")
                // .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.authorizeRequests()
                .antMatchers("/test/**").authenticated() // 对其进行拦截
                .anyRequest().permitAll(); // 所有的请求都放行
        //关闭 csrf 防护
        http.csrf().disable();
        //表单登陆
        http.formLogin()
                // 自定义登陆页面,默认是 /login
                .loginPage("/login-view")//登录页面
                .loginProcessingUrl("/login")
                .successForwardUrl("/successForwardUrl")
                .permitAll()
        ;

    }

    @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");

    }
}
 

自定义登陆接口和请求参数

@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" %>
<html>
<head>
    <title>用户登录</title>
</head>
<body>
<form action="LoginProcessingUrlSecurityConfig-login-action" method="post">
    用户名:<input type="text" name="un"><br>&nbsp;&nbsp;码:
    <input type="password" name="pw"><br>
    <input type="submit" value="登录">
</form>
</body>
</html>

自定义成功的 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")//登录页面
                .loginProcessingUrl("/login")
                .successHandler((request, response, authentication) -> {
                    response.setContentType("application/json");
                    PrintWriter out = response.getWriter();
                    Map<String, Object> 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
                .authorizeRequests()
                .antMatchers("/test/**").authenticated() // 对其进行拦截
                .anyRequest().permitAll() // 所有的请求都放行
                .and()
                //表单登陆
                .formLogin()
                // 自定义登陆页面,默认是 /login
                .loginPage("/login-view")//登录页面
                .loginProcessingUrl("/login")
                // 用户如果在验证之前访问过安全页面,则在验证成功后用户将被重定向到该访问页面,不然就会跳转到默认的配置的页面
                // .defaultSuccessUrl("/test/test")
                .successForwardUrl("/successForwardUrl")
                .and().csrf().disable()
        ;
    }

    @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");

    }

}

访问页面

127.0.0.1:8080 访问即可…

后言

我按照这个步骤从新跑了一个新的Demo 是没问题… 如有问题留言…

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值