文档章节

springboot系列十五 security 简单配置 保护接口安全

yimingkeji
 yimingkeji
发布于 01/04 16:59
字数 898
阅读 164
收藏 4

springsecurity提供了基于用户、角色、权限的安全控制

简单使用

在项目中加入security的依赖

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

写一个接口

@RestController
public class IndexResource {

    @RequestMapping({"", "/", "/index"})
    public String index(){
        return "index";
    }
}

启动项目后,访问 localhost:8080 发现需要输入用户名密码。这其实是springsecurity的默认安全配置。

其实日志中已经有提示给我们:

2019-01-03 13:58:55.572  INFO 79013 --- [  restartedMain] .s.s.UserDetailsServiceAutoConfiguration : 

Using generated security password: de5cf28a-25d9-47d6-a0bd-bb4e41cf4d39

这段日志是从UserDetailsServiceAutoConfiguration这个类中打印的。

private String getOrDeducePassword(User user, PasswordEncoder encoder) {
        String password = user.getPassword();
        if (user.isPasswordGenerated()) {
            logger.info(String.format("%n%nUsing generated security password: %s%n", user.getPassword()));
        }

        return encoder == null && !PASSWORD_ALGORITHM_PATTERN.matcher(password).matches() ? "{noop}" + password : password;
    }

密码有了,那用户名呢?

查看security的配置类org.springframework.boot.autoconfigure.security.SecurityProperties.User,发现用户名默认为user,密码是临时UUID

public static class User {
        private String name = "user";//用户名
        private String password = UUID.randomUUID().toString();//密码
        private List<String> roles = new ArrayList();
        private boolean passwordGenerated = true;

        public User() {
        }
        //...
}

然后在浏览器输入用户名密码,接口正常访问

自定义用户名密码配置

怎么自定义用户密码?

在配置文件中加入security的配置:

spring:
  security:
    user:
      name: admin
      password: admin

然后重新访问,输入admin / admin 访问成功。(部分浏览器需要清除之前的缓存才看到效果)

web页面安全访问

在web页面中一般都需要登录后(拿到session)才能访问

页面

先写2个页面

login.html

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:th="http://www.thymeleaf.org"
      xmlns:sec="http://www.thymeleaf.org/thymeleaf-extras-springsecurity3">
<head>
    <title>Spring Security 登录 </title>
    <!-- 最新版本的 Bootstrap 核心 CSS 文件 -->
    <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@3.3.7/dist/css/bootstrap.min.css" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous">

    <!-- 最新的 Bootstrap 核心 JavaScript 文件 -->
    <script src="https://cdn.jsdelivr.net/npm/bootstrap@3.3.7/dist/js/bootstrap.min.js" integrity="sha384-Tc5IQib027qvyjSMfHjOMaLkfuWVxZxUPnCJA7l2mCWNIpG9mGCD8wGNIcPD7Txa" crossorigin="anonymous"></script>
</head>
<body>
<form class="form-horizontal" th:action="@{/login}" method="post">
    <h1>Login</h1>
    <div th:if="${param.error}">
        用户名或密码错
    </div>
    <div th:if="${param.logout}">
        您已注销成功
    </div>
    <div class="form-group">
        <label for="inputEmail3" class="col-sm-2 control-label">Username</label>
        <div class="col-sm-10">
            <input type="text" class="form-control" id="inputEmail3" name="username" placeholder="Username">
        </div>
    </div>
    <div class="form-group">
        <label for="inputPassword3" class="col-sm-2 control-label">Password</label>
        <div class="col-sm-10">
            <input type="password" class="form-control" id="inputPassword3" name="password" placeholder="Password">
        </div>
    </div>
    <div class="form-group">
        <div class="col-sm-offset-2 col-sm-10">
            <button type="submit" class="btn btn-default">Sign in</button>
        </div>
    </div>
</form>
</body>
</html>

index.html

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org"
      xmlns:sec="http://www.thymeleaf.org/thymeleaf-extras-springsecurity3">
<head>
    <title>Spring Security入门</title>
</head>
<body>
<h1>欢迎使用Spring Security!</h1>

欢迎你:<p th:text="${username}"/></p>
<p>点击 <a th:href="@{/loginout}">这里</a> 退出登录</p>
</body>
</html>

当用户登录成功后跳转到index页面

安全配置

@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

    /**
     * http访问控制
     * @param http
     * @throws Exception
     */
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
                .antMatchers("/", "/login").permitAll()//允许访问
                .anyRequest().authenticated()//其他所有url都需要鉴权,如果未登陆则跳转登陆页面
            .and()
                .formLogin()
                    .loginPage("/login")//指定登录页面地
                    .loginProcessingUrl("/login")//登录处理url
                    .successForwardUrl("/home")//登录成功后跳转url
                    .permitAll()//允许访问
            .and()
                .logout().logoutUrl("/loginout").permitAll();//指定登出url,并且允许访问
    }

    /**
     * 全局配置:
     *  创建一个内存用户
     *    用户名 admin
     *    密码 admin
     *    角色 USER
     */
    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
		//新版本security框架这里需要指定密码加密方式,不然报错:There is no PasswordEncoder mapped for the id “null”
        BCryptPasswordEncoder pwdEncoder = new BCryptPasswordEncoder();
        auth.inMemoryAuthentication()
                .passwordEncoder(pwdEncoder)
                .withUser("admin")
                .password(pwdEncoder.encode("admin"))
                .roles("ADMIN");
    }
}

控制层

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

    @RequestMapping("/home")
    public String home(Model model){
        User principal = (User)SecurityContextHolder.getContext().getAuthentication().getPrincipal();
        model.addAttribute("username", principal.getUsername());
        return "index";
    }

    @RequestMapping("/loginout")
    public String loginout(){
        SecurityContextHolder.clearContext();
        return "login";
    }

测试

© 著作权归作者所有

yimingkeji
粉丝 14
博文 47
码字总数 30840
作品 0
杭州
私信 提问
恒宇少年/spring-boot-chapter

简书整套文档以及源码解析 专题 专题名称 专题描述 001 Spring Boot 核心技术 讲解SpringBoot一些企业级层面的核心组件 002 Spring Cloud 核心技术 对Spring Cloud核心技术全面讲解 003 Quer...

恒宇少年
2018/04/19
0
0
【SpringBoot2.0系列05】SpringBoot之整合Mybatis

【SpringBoot2.0系列01】初识SpringBoot 【SpringBoot2.0系列02】SpringBoot之使用Thymeleaf视图模板 【SpringBoot2.0系列03】SpringBoot之使用freemark视图模板 【SpringBoot2.0系列04】Spr...

余空啊
2018/08/14
0
0
SpringBoot+mybatis+springsecurity实现用户角色数据库管理

SpringSecurity是专门针对基于Spring项目的安全框架,充分利用了依赖注入和AOP来实现安全管控。在很多大型企业级系统中权限是最核心的部分,一个系统的好与坏全都在于权限管控是否灵活,是否...

ben4
2017/11/24
0
0
【SpringBoot2.0系列08】SpringBoot之redis数据缓存管理

【SpringBoot2.0系列01】初识SpringBoot 【SpringBoot2.0系列02】SpringBoot之使用Thymeleaf视图模板 【SpringBoot2.0系列03】SpringBoot之使用freemark视图模板 【SpringBoot2.0系列04】Spr...

余空啊
2018/08/20
0
0
springboot+security整合1

说明springboot版本2.0.3 一、 介绍   Spring Security是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架。它提供了一组可以在Spring应用上下文中配置的B...

烦嚣的人
2018/07/23
0
0

没有更多内容

加载失败,请刷新页面

加载更多

OSChina 周六乱弹 —— 早上儿子问我他是怎么来的

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @凉小生 :#今日歌曲推荐# 少点戾气,愿你和这个世界温柔以待。中岛美嘉的单曲《僕が死のうと思ったのは (曾经我也想过一了百了)》 《僕が死の...

小小编辑
今天
2.4K
15
Excption与Error包结构,OOM 你遇到过哪些情况,SOF 你遇到过哪些情况

Throwable 是 Java 中所有错误与异常的超类,Throwable 包含两个子类,Error 与 Exception 。用于指示发生了异常情况。 Java 抛出的 Throwable 可以分成三种类型。 被检查异常(checked Exc...

Garphy
今天
41
0
计算机实现原理专题--二进制减法器(二)

在计算机实现原理专题--二进制减法器(一)中说明了基本原理,现准备说明如何来实现。 首先第一步255-b运算相当于对b进行按位取反,因此可将8个非门组成如下图的形式: 由于每次做减法时,我...

FAT_mt
昨天
40
0
好程序员大数据学习路线分享函数+map映射+元祖

好程序员大数据学习路线分享函数+map映射+元祖,大数据各个平台上的语言实现 hadoop 由java实现,2003年至今,三大块:数据处理,数据存储,数据计算 存储: hbase --> 数据成表 处理: hive --> 数...

好程序员官方
昨天
61
0
tabel 中含有复选框的列 数据理解

1、el-ui中实现某一列为复选框 实现多选非常简单: 手动添加一个el-table-column,设type属性为selction即可; 2、@selection-change事件:选项发生勾选状态变化时触发该事件 <el-table @sel...

everthing
昨天
21
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部