Spring Security 入门

Spring-Security

本文测试所用demo资源已上传:https://download.csdn.net/download/qq_42295733/12125241
Spring Security是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架。它提供了一组可以在Spring应用上下文中配置的Bean,充分利用了Spring IoC,DI(控制反转Inversion of Control ,DI:Dependency Injection 依赖注入)和AOP(面向切面编程)功能,为应用系统提供声明式的安全访问控制功能,减少了为企业系统安全控制编写大量重复代码的工作。

官网:https://www.springcloud.cc/spring-security.html

导入依赖

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-security</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.security</groupId>
            <artifactId>spring-security-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.thymeleaf</groupId>
            <artifactId>thymeleaf-spring5</artifactId>
        </dependency>
        <dependency>
            <groupId>org.thymeleaf.extras</groupId>
            <artifactId>thymeleaf-extras-java8time</artifactId>
        </dependency>

用户授权和认证

路由控制

@Controller
public class RouterController {
    @RequestMapping({"/","/index","/index.html"})
    public String index() {
        return "index";
    }

    @RequestMapping("/toLogin")
    public String toLogin() {
        return "/views/login";
    }

    @RequestMapping("/level1/{id}")
    private String level1(@PathVariable("id") int id) {
        return "/views/level1/" + id;
    }

    @RequestMapping("/level2/{id}")
    private String level2(@PathVariable("id") int id) {
        return "/views/level2/" + id;
    }

    @RequestMapping("/level3/{id}")
    private String level3(@PathVariable("id") int id) {
        return "/views/level3/" + id;
    }

}

到目前为止,我们的WebSecurityConfig仅包含有关如何验证用户身份的信息。Spring Security如何知道我们要求所有用户都经过身份验证?Spring Security如何知道我们想要支持基于表单的身份验证?原因是WebSecurityConfigurerAdapterconfigure(HttpSecurity http)方法中提供了一个默认配置

@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
    @Override
    protected void configure(HttpSecurity http) throws Exception {

        //首页所有人可以访问,功能页只有对应有权限的人才能访问
        http
                .authorizeRequests().antMatchers("/").permitAll()
                .antMatchers("/level1/**").hasRole("vip1")
                .antMatchers("/level2/**").hasRole("vip2")
                .antMatchers("/level3/**").hasRole("vip3");

        //没有权限就会默认到登陆页面
        http.formLogin();

    }
}

上述规定了各个级别角色所能访问的页面,运行测试一下

在这里插入图片描述
在这里插入图片描述

未分配角色前,点击任意一个页面后,自动在url后添加/login,这便是我们的配置生效了

现在继续重写一个方法protected void configure(AuthenticationManagerBuilder auth)

@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
    //此处采用内存验证用户账号密码,也可以用数据库
    auth.inMemoryAuthentication()//各个用户分配角色权限
            .withUser("lizeyu").password("111111").roles("vip2", "vip3")
            .and()
            .withUser("root").password("111111").roles("vip1", "vip2", "vip3")
            .and()
            .withUser("guest").password("111111").roles("vip1");
}

运行后会发现报一个错误

采用普通用户登录

在这里插入图片描述

在这里插入图片描述

提醒我们密码需要设置加密,完整代码如下

//认证:springboot 2.1.X 可以直接使用
//密码编码:PasswordEncoder()
//在spring security 5.0+,新增了很多的加密方法
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
    auth.inMemoryAuthentication().passwordEncoder(new BCryptPasswordEncoder())
            .withUser("lizeyu").password(new BCryptPasswordEncoder().encode("111111")).roles("vip2", "vip3")
            .and()
            .withUser("root").password(new BCryptPasswordEncoder().encode("111111")).roles("vip1", "vip2", "vip3")
            .and()
            .withUser("guest").password(new BCryptPasswordEncoder().encode("111111")).roles("vip1");
}

再次运行依然是普通用户登录,访问level1下的目录,由上可知是vip1角色才可以

在这里插入图片描述

这样目的达到,OJBK

增加注销功能

//注销
http.logout();

采用semantic-ui作为样板

<link href="https://cdn.bootcss.com/semantic-ui/2.4.1/semantic.min.css" rel="stylesheet">

<!--注销-->
    <a class="item" th:href="@{/logout}">
       <i class="sign-out icon"></i>注销
    </a>

测试

在这里插入图片描述

在这里插入图片描述
注销成功,OJBK

如果我们想让注销后跳到首页:

//注销,开启了注销功能,跳到首页
http.logout().logoutSuccessUrl("/");

为实现不同权限的用户仅显示自己拥有权限的页面,我们引入thymeleaf与secrity整合的包

<dependency>
    <groupId>org.thymeleaf.extras</groupId>
    <artifactId>thymeleaf-extras-springsecurity4</artifactId>
    <version>3.0.4.RELEASE</version>
</dependency>

导入sec命名空间

xmlns:sec="http://www.thymeleaf.org/thymeleaf-extras-springsecurity4"

实现未登录仅显示登录按钮,登录成功显示用户名和注销按钮

				<!--如果未登录-->
                <!--Authenticated 表示用户已经认证-->
                <div sec:authorize="!isAuthenticated()">
                    <!--未登录-->
                    <a class="item" th:href="@{/toLogin}">
                        <i class="address card icon"></i> 登录
                    </a>
                </div>

                <!--如果已经登录-->
                <div sec:authorize="isAuthenticated()">
                    <a class="item">
                        用户名:<span sec:authentication="name"></span>
                    </a>
                </div>

                <div sec:authorize="isAuthenticated()">
                    <!--注销-->
                    <a class="item" th:href="@{/logout}">
                        <i class="sign-out icon"></i>注销
                    </a>
                </div>

在这里插入图片描述

此时会发现一个问题,我们注销后无法返回首页,会进入到一个404页面,可能原因是我们采用的提交请求是get,security会认为明文传输不安全,自动帮我们屏蔽,这时我们不能觉得我们代码错了,而是配置问题

在这里插入图片描述

//关闭防止网站攻击
http.csrf().disable();

OJBK

实现不同权限用户不同页面

sec:authorize="hasRole('vip2')"          <!--加入显示标签内即可-->

在这里插入图片描述

这样我们的权限控制就完成了

记住我功能实现

//记住我功能实现
http.rememberMe();

在这里插入图片描述

定制我们的登录页面

//定制登陆页面
http.formLogin().loginPage("/toLogin");

ok!

在自定义登录界面添加记住我按钮

//自定义记住我标签的name
http.rememberMe().rememberMeParameter("remember");
<div class="field">
   <input type="checkbox" name="remember-me">记住我
</div>

如果不自定义记住我的参数,观看源码可知默认的参数名为remember-me,即可自动后台帮我们设置cookie中记住我的参数

本部分只是对SpringSecurity初步的入门讲解,真正企业开发整合:https://www.cnblogs.com/cao-lei/p/13298394.html

学习资源:https://blog.csdn.net/qq_42640067/article/details/113062222

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
Spring Security是一个用于身份验证和授权的框架,在Spring项目中提供了一套强大的安全性解决方案。以下是你入门Spring Security的步骤: 1. 添加Spring Security依赖:在你的项目中,通过Maven或Gradle添加Spring Security的依赖。例如,在Maven中,你可以添加以下依赖: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId> </dependency> ``` 2. 配置Spring Security:创建一个配置类来配置Spring Security。这个配置类需要继承`WebSecurityConfigurerAdapter`类,并覆盖`configure`方法。例如,你可以创建一个类叫做`SecurityConfig`: ```java @Configuration @EnableWebSecurity public class SecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { http .authorizeRequests() .antMatchers("/public/**").permitAll() // 允许公共访问的URL .anyRequest().authenticated() // 其他URL需要身份验证 .and() .formLogin() // 启用表单登录 .loginPage("/login") // 自定义登录页面URL .permitAll() .and() .logout() // 启用注销 .permitAll(); } } ``` 上述配置中,我们定义了哪些URL是公开访问的,哪些URL需要身份验证,以及自定义了登录和注销的相关配置。 3. 创建用户服务:在上面的配置类中,你需要定义一个用户服务来获取用户的身份验证信息。这可以通过实现`UserDetailsService`接口来完成。你可以创建一个类叫做`UserService`来实现这个接口,并重写`loadUserByUsername`方法: ```java @Service public class UserService implements UserDetailsService { @Override public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { // 从数据库或其他数据源中获取用户信息 // 然后返回一个实现了UserDetails接口的类,代表用户的身份验证信息 // 例如,你可以使用Spring Security提供的User类 return User.builder() .username(username) .password("password") .roles("USER") .build(); } } ``` 上述代码中,我们简单地返回了一个固定的用户信息,实际应用中你需要从数据库或其他数据源中获取真实的用户信息。 4. 配置密码编码器:为了安全起见,你需要对用户密码进行编码。在上述的配置类中,通过重写`configure`方法来配置密码编码器。例如: ```java @Configuration @EnableWebSecurity public class SecurityConfig extends WebSecurityConfigurerAdapter { @Autowired private UserService userService; @Bean public PasswordEncoder passwordEncoder() { return new BCryptPasswordEncoder(); } @Override protected void configure(AuthenticationManagerBuilder auth) throws Exception { auth.userDetailsService(userService).passwordEncoder(passwordEncoder()); } // 其他配置... } ``` 上述代码中,我们使用了`BCryptPasswordEncoder`来对密码进行编码。 这些是入门Spring Security的基本步骤。当你完成了上述配置后,你的应用程序将需要进行身份验证,并且可以通过URL保护来限制访问。你可以根据需要进一步自定义和扩展Spring Security的功能。希望这能帮助到你!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

nan feng

打赏一杯咖啡吧

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值