如何在idea中使用Spring Security框架

一.首先在idea中创建maven项目

记得一定要保持网络通常

这里根据实际情况取,跟我一样也行,设置完后点右下角的next

第一个是你的项目名,第二个是你要存的地址,设置完后点finish

1.向pom.xml文件添加依赖

项目创建之后先向项目结构最下面的pom.xml文件添加依赖

第一次添加依赖的时候要等待一段时间才不暴红,如果下面没有进度条还是爆红,可能是你的maven的镜像源有问题或者是你没联网

 <dependencies>
        <!-- SpringBoot -->
       <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-dependencies</artifactId>
            <version>2.1.10.RELEASE</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
        <!-- SpringMVC -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <version>2.1.10.RELEASE</version>
        </dependency>
        <!-- Thymeleaf -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
            <version>2.1.10.RELEASE</version>
        </dependency>
        <!--Spring Security-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-security</artifactId>
            <version>2.1.10.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.24</version>
            <scope>compile</scope>
        </dependency>

        <dependency>
            <groupId>io.jsonwebtoken</groupId>
            <artifactId>jjwt</artifactId>
            <version>0.7.0</version>
        </dependency>
        <!--json-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.60</version>
            <scope>compile</scope>
        </dependency>
    </dependencies>

2.在resources下创建application.yml文件,并配置yml的端口号:(如果自己项目的端口号不冲突也可以不用配置)

可以自己取,只要端口号不要被占用,注意:后要有空格,port不能和server同一列(两个并排)

3.创建要测试的html页面main.html

再在resources里创建templates文件夹,再在这个文件夹创建main.html网页

4.创建控制层controller

小写字母开头的是包名,大写字母创建的是类名,这是快速创建包和类的一种方式。下面这个图就是包名.包名.类名

这里的string返回方式有几种, 这里的 return “main”是指要跳向的页面为main,所以不能用@RestController注解修饰类,也不能用@ResponseBody修饰方法。

@Controller
public class SecurityController {


    @RequestMapping("/main")
    public  String main(){

        return "main";
    }
    
}

5.创建启动类父类

springboot需要创建一个启动类,记得这个启动类所处的包一定是最高级的,比如一个类的包的位置是,那你的启动类的位置就必须是com,也可以说是点少的是老大(哈哈哈)。

//启动类的代码

@SpringBootApplication
public class SecurityMain {
    public static void main(String[] args) {
        SpringApplication.run(SecurityMain.class,args);
    }
}

 6.运行项目

搭建完了看一下运行咋样把

6.1.启动启动类

启动下启动类看看

6.2.地址栏输入

在自己的浏览器上面的地址栏输入localhost:8181(这是我上面yml配的,没配应该是8080)/main,"/main"这是你在控制层的url,自己随便取得。

6.3.来到Spring Security自带的登录

如果成功了就来到了Spring Security自带的登录界面,用户名默认是user,密码在你idea的控制台里能看

密码在这里

登陆:

最后成功运行的效果:

二.自定义认证逻辑

 如果我们没有进行任何的配置,账号和密码是由Spring Security定义生成的,那跟实际情况严重不符合,所以我们要自己去定义谁能登录,然后有啥权限等。

1.创建配置类

我们先自己创建·一个配置类,可以随便取,但是为了规范和以后好识别类的作用,我们先创建一个SecurityConfig配置类,创建方法和上面一样。

代码:

@Configuration
public class SecurityConfig {

    @Bean  /* security框架要求密码必须是加密的处理,推荐的是BCryptPasswordEncoder()这种方式*/
    public PasswordEncoder getPwdEncoder(){
        return new BCryptPasswordEncoder();
    }
}

2.创建业务实现类

再创建业务类(这里没有创建接口,下面业务实现类后面的接口是自带的)

后面那个UserDetailsService这个接口不是自己创立的,而是自带的,如果爆红就import

@Service
public class UserDetailsServiceImpl implements UserDetailsService {
    @Autowired
    private PasswordEncoder encoder;

    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        //1. 查询数据库判断用户名是否存在,如果不存在抛出UsernameNotFoundException
        if(!username.equals("admin")){
            throw new UsernameNotFoundException("用户名不存在");
        }
        //把查询出来的密码进行解析,或直接把password放到构造方法中。
        //理解:password就是数据库中查询出来的密码,查询出来的内容不是123
        String password = encoder.encode("123");
        return new User(username,password, AuthorityUtils.commaSeparatedStringToAuthorityList("admin"));

    }
}

下面那个new User 记得别导错包了!

new User()里的参数-》用户,密码,权限

3.启动项目

然后启动项目,用户和密码是刚刚你在idea写的。

登陆失败

三.自定义登录界面

我们用的这个登录界面是这个框架自己带的,那肯定以后是要自己写的,所以我们现在要开始创建属于自己的登录界面了。

1.创建属于自己的登录界面

方法必须是post

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<form action="/login" method="post">
    用户名:<input type="text" name="username"/><br/>
    密码:<input type="password" name="password"/><br/>
    <input type="submit" value="提交">

</form>
</body>
</html>

2.对自己定义的配置类做修改

让你之前的配置文件类继承WebSecurityConfigurerAdapter

然后右键选择Generate,再选择override methods,然后选择

这里选的是有http的configure,一定不要选择错了

然后在这个方法里添加以下代码

http.formLogin()
                .loginProcessingUrl("/login")//要访问下面的(比如说要访问/main), .loginProcessingUrl括号里的路径一定是第一个出现的
                //此处表单不写action属性也可以  //当发现/login时认为是登录,需要执行UserDetailsServiceImpl
                .successForwardUrl("/main")   //此处是post请求,提交成功之后往哪去
                .loginPage("/login.html");//登陆失败去哪

        // url 拦截
        http.authorizeRequests()
                .antMatchers("/login.html").permitAll() //login.html不需要被认证放行
                .anyRequest().authenticated();//所有的请求都必须被认证。必须登录后才能访问。

        //关闭csrf防护
        http.csrf().disable();

3.启动项目

搞完上面的就开始启动项目,这次跳转的页面就是我们自己设计的页面了。

四.持久化登录

说白了就是把用户数据存起来,然后我们下次不用再输入用户名和密码登录了。

1.创建mysql数据库

首先我们先要准备一个数据库,我这用的是mysql数据库,操作数据库的软件是Navicat Premium 16

我们先创建一个数据库名字必须叫security

双击security数据库(或者右键打开它),从灰变成绿色,在右键新建查询

再在查询里输入创建表的语句,然后右上角运行

create table persistent_logins (
username varchar(64) not null, 
series varchar(64) primary key, 
token varchar(64) not null, 
last_used timestamp not null)

下面显示运行成功,然后我们刷新或者退出重进。

这个数据库表一开始空的,记住。

2.再次修改配置文件和创建新配置文件类

然后在idea的application.yml添加你数据库的信息。

driver-class-name 这个跟你的数据库版本有关,我这里用的8版本

username:你的mysql数据库的用户名,如果你不改一般是root

password:你的mysql数据库的密码

url 前面的jdbc:mysql应该是一样的,后面的3306默认(可以去你安装的mysql的路径下找my.ini,右键打开方式记事本打开,然后看看port端口是啥这里就是啥),security是你的数据库的名字

3.怎么查看自己mysql的端口号(知道的可以跳过这一步)

一直查找下一个,找到就行了,这个3306就是你mysql数据库的端口号了。

3.向pom.xml添加数据库依赖

 <!-- 4.添加mysql数据库的驱动包依赖-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.30</version>
        </dependency>
        <!-- 3.添加Mybatis 的启动器依赖-->
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.1.1</version>
        </dependency>

4.再次创建一个配置类RememberMeConfig

要是DataSource红了就点它会有个import class的选项,点它就行了。

@Configuration
public class RememberMeConfig {

    @Autowired
    private DataSource dataSource;
    @Bean
    public PersistentTokenRepository getPersistentTokenRepository() {
        JdbcTokenRepositoryImpl jdbcTokenRepositoryImpl=new JdbcTokenRepositoryImpl();
        jdbcTokenRepositoryImpl.setDataSource(dataSource);
        //自动建表,第一次启动时需要,第二次启动时注释掉
        //jdbcTokenRepositoryImpl.setCreateTableOnStartup(true);  //该代码不好用,使用sql手动创建库,表
        return jdbcTokenRepositoryImpl;
    }

}

5.修改 之前创建的SecurityConfig 配置文件 类。

下面这俩放这个SecurityConfig 配置文件 类里面的最上面

@Autowired
    PersistentTokenRepository repository;
   // private  RememberMeConfig repository;

    @Autowired
    private UserDetailsServiceImpl userDetailsService;
    

下面这个放configure这个方法里

http.rememberMe()
        .userDetailsService(userDetailsService) //登录逻辑交给哪个对象
        .tokenRepository(repository);   //持久层对象

然后再来到你自己制作的登陆界面(login.html)添加

<input type="checkbox" name="remember-me" value="true"/> <br/>

6.启动项目

红圈里勾上,然后点提交

7.查看数据库情况

去数据库的表里查看时,多了一个username为admin的数据,这就存储了admin用户的登录信息,该用户如果要再次访问/main的话就可以不用再输入用户名和密码了,但是这个存储时间有限,一般是两周。

五.消除持久化

就是加一个标签的事,在你main.html页面加一个(主要是href里的logout起作用)。

<a href="/logout">退出登陆</a>

然后启动项目:,点击退出项目,这时再到数据库刷新,查看数据时原来的admin信息被删除了,如果重新登录就得输入用户名和密码了。

六.Thymeleaf中Spring Security的使用,获得属性

根据源码得出下面属性:

name:登录账号名称

principal:登录主体,在自定义登录逻辑中是UserDetails

credentials:凭证(密码)

authorities:权限和角色

details:实际上是WebAuthenticationDetails的实例。可以获取remoteAddress(客户端ip)和sessionId(当前sessionId)

1.在pom.xml中添加依赖

如果maven加载完还爆红,那就试试把下面version标签的版本最后的3改小或者改答,比如改成3.0.4或者改成3.0.2试试。

<dependency>
            <groupId>org.thymeleaf.extras</groupId>
            <artifactId>thymeleaf-extras-springsecurity5</artifactId>
            <version>3.0.3.RELEASE</version>
 </dependency>

2.创建show.html测试页面

在项目resources中新建templates文件夹,在templates中新建show.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-springsecurity5">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<h1>获得springsecurity属性</h1>
登录账号:<span sec:authentication="name">123</span><br/>
登录账号:<span sec:authentication="principal.username">456</span><br/>
凭证:<span sec:authentication="credentials">456</span><br/>
权限和角色:<span sec:authentication="authorities">456</span><br/>
客户端地址:<span sec:authentication="details.remoteAddress">456</span><br/>
sessionId:<span sec:authentication="details.sessionId">456</span><br/>

通过权限判断:
<button sec:authorize="hasAuthority('/insert')">新增</button>
<button sec:authorize="hasAuthority('/delete')">删除</button>
<button sec:authorize="hasAuthority('/update')">修改</button>
<button sec:authorize="hasAuthority('/select')">查看</button>
<br/>
通过角色判断:
<button sec:authorize="hasRole('abc')">新增</button>
<button sec:authorize="hasRole('abc')">删除</button>
<button sec:authorize="hasRole('abc')">修改</button>
<button sec:authorize="hasRole('abc1')">查看</button>
</body>
</html>

3.对控制器进行编译

我们回到我们的控制层controller,

并在SecurityController这个类里添加以下的代码

@RequestMapping("/show")
    public  String show(){

        return "show";
    }

4.在业务类重新进行权限设置

我们又回到UserDetailsServiceImpl这个实现类

把里面的return new Uer...........注掉,然后写下面那个代码

return new User(username,password, AuthorityUtils.commaSeparatedStringToAuthorityList("admin,/select,/insert,ROLE_abc1"));

相当于获得这个admin用户的基本信息和权限信息,它能干啥,不能干啥。这个说明了admin只有查询和增加功能,然后这几个参数的顺序可以随便。

5.启动项目

登录

上面的地址栏改为show.然后跳转

七.我idea项目的项目结构

希望能帮到大家。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值