SpringBoot与安全

比较常用的安全框架:shiroSpring Security

Spring Security使用

1、引入Spring Security

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

2、编写Spring Security的配置类

@EnableWebSecurity    // 已经带了@Configuration注解了,不用再使用@Configuration注解了
public class MySecurityConfig extends WebSecurityConfigurerAdapter {
}

登录 & 角色 & 登出

@EnableWebSecurity    // 已经带了@Configuration注解了,不用再使用@Configuration注解了
public class MySecurityConfig extends WebSecurityConfigurerAdapter {
    // 定义授权规则
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests().antMatchers("/").permitAll()     // 允许所有人访问根路径
            .antMatchers("/level1/**").hasRole("VIP1")            // 即要想访问/level1下的所有请求都必须拥有VIP1的角色
            .antMatchers("/level2/**").hasRole("VIP2");             // 要想访问/level2下的所有请求都必须拥有VIP2的角色

        // 开启自动配置的登录功能,默认去/login页面。效果:如果没有权限会来到登录页面
        http.formLogin();

        // 开启自动配置的注销功能,访问/logout表示用户注销,必须发送post请求
        http.logout()
        .logoutSuccessUrl("/");        // 退出成功后跳转的地址
    }

    // 定义认证规则
    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.inMemoryAuthentication()           // 将用户名跟密码角色等放到内存中
            .withUser("zhangsan").password("123456").roles("VIP1", "VIP2")    // 定义用户 密码 分配角色
            .and()
                .withUser("lisi").password("123").roles("VIP1");               // 再添加一个用户
    }
}

权限控制

1、引入thymeleafspring security的依赖

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

2、在html页面引入security的名称空间

<html xmlns:th="http://www.thymeleaf.org"
      xmlns:sec="http://www.thymeleaf.org/thymeleaf-extras-springsecurity4">

3、判断权限相关

<!-- 判断是否登录 -->
<div sec:authorize="!isAuthenticated()">
    如果没有登录怎样。。。
</div>
<div sec:authorize="isAuthenticated()">
    如果登录怎样。。。
</div>




<!-- 用户名 -->
<span sec:authentication="name"></span>
<!-- 拥有的角色 -->
<span sec:authentication="principal.authorities"></span>

<!-- 判断用户是否拥有角色 -->
<div sec:authorize="hasRole('VIP1')">
    如果有VIP1的角色怎样。。。
</div>

记住我 & 定制登录页

记住我

// 定义授权规则
@Override
protected void configure(HttpSecurity http) throws Exception {
    // 开启记住我功能
    http.rememberMe()
         .rememberMeParameter("remember");    // 表单提交的name参数

}

定制登录页

// 定义授权规则
@Override
protected void configure(HttpSecurity http) throws Exception {
    http.formLogin()
        .usernameParameter("user")   // 自定制页面中提交的name属性
        .passwordParameter("pwd")
        .loginProcessingUrl("/login")     // 处理认证的url,如果不配置就默认去当前url的post请求认证
        .loginPage("/userlogin");   // 修改登录的页面


	// 开启记住我功能
	http.rememberMe()
        .rememberMeParameter("remember");    // 表单提交的name参数

}

 

posted @ 2018-09-20 13:28  Jin同学  阅读(96)  评论(0)    收藏  举报