栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Security-相关自定义学习

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Security-相关自定义学习

前言

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

新建项目

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

POM

pom,这里的依赖只是添加了 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 是没问题… 如有问题留言…

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/328126.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号