1.搭建Shiro环境
1-1.JDK环境:JDK1.8+2017版本idea+Mysql数据库
1-2.需要导入的依赖:
整合Mybatis包
<!-- https://mvnrepository.com/artifact/org.mybatis.spring.boot/mybatis-spring-boot-starter -->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.2.1</version>
</dependency>
整合Shiro包
<!-- https://mvnrepository.com/artifact/org.apache.shiro/shiro-spring -->
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-spring</artifactId>
<version>1.8.0</version>
</dependency>
其他自导包
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
1-3.前端界面(此处需了解thymeleaf技术)
add.html代码
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
add
</body>
</html>
update.html代码
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
update
</body>
</html>
index.html代码
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
首页
<h4><a th:href="@{/add}">add</a></h4>
<h4><a th:href="@{/update}">update</a></h4>
</body>
</html>
login.html代码(表单可以去bootstrap上去找)
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form class="form-inline" th:action="@{/user/login}">
<div class="form-group">
<label for="exampleInputName2">用户名</label>
<input type="text" th:name="username" class="form-control" id="exampleInputName2" >
</div>
<div class="form-group">
<label for="exampleInputEmail2">密码</label>
<input type="password" th:name="password" class="form-control" id="exampleInputEmail2" >
</div>
<button type="submit" class="btn btn-default">提交</button>
</form>
</body>
</html>
1-4 .YML文件(设置连接数据库资源+整合Mybatis包-映射类,此处注意自己的数据库连接后可能会出错)
spring:
datasource:
username: root
password: 123456
url: jdbc:mysql://localhost:3306/book
driver-class-name: com.mysql.cj.jdbc.Driver
mybatis:
type-aliases-package: com.example.demo.pojo
mapper-locations: classpath:mapper/*.xml
1-5 .xml文件(注意修改自己的路径)
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.demo.Mapper.personMapper">
<select id="showuser" resultType="Person" parameterType="String">
select * from t_user WHERE username=#{name}
</select>
</mapper>
1-6数据库表
2.编写代码
2.1包结构图
2.2编写Person映射类
package com.example.demo.pojo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Person {
//导入了Lombak依赖
private String username;
private String password;
private String auth;
}
2.3 编写personMapper接口(注意此接口要用两个注解)
ackage com.example.demo.Mapper;
import com.example.demo.pojo.Person;
import org.apache.ibatis.annotations.Mapper;
import org.springframework.stereotype.Component;
import java.util.List;
@Mapper //此注解表示mapper需要扫过的类
@Component
public interface personMapper {
public Person showuser(String name);
}
2.4编写UserRelam类
package com.example.demo.config;
import com.example.demo.Mapper.personMapper;
import com.example.demo.pojo.Person;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.*;
import org.apache.shiro.authz.AuthorizationInfo;
import org.apache.shiro.authz.SimpleAuthorizationInfo;
import org.apache.shiro.realm.AuthorizingRealm;
import org.apache.shiro.subject.PrincipalCollection;
import org.apache.shiro.subject.Subject;
import org.springframework.beans.factory.annotation.Autowired;
public class UserRelam extends AuthorizingRealm {
//注入mabatis数据库信息,操作JDBC teamplate中的方法
@Autowired
personMapper personmapper;
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
System.out.println ("执行了授权UserRelam方法" );
//授权操作
SimpleAuthorizationInfo info = new SimpleAuthorizationInfo ( );
//通过SecurityUtils拿到当前登录对象
Subject subject = SecurityUtils.getSubject ( );
//通过拿到的是Object对象。可以强转
Person principal = (Person) subject.getPrincipal ( );
info.addStringPermission ( principal.getAuth () );
return info;
}
@Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {
System.out.println ("执行了认证UserRelam2方法" );
/*String username="admin";
String password="123456";*/
//封装当前登录对象信息
UsernamePasswordToken usertoken=(UsernamePasswordToken)authenticationToken;
//查询数据库信息
Person showuser = personmapper.showuser ( usertoken.getUsername ( ) );
System.out.println ( usertoken.getUsername ( ) );
System.out.println ( showuser );
if(showuser==null)
{
return null;
}
//通过pricipal可以拿到认证中的当前对象
return new SimpleAuthenticationInfo ( showuser,showuser.getPassword (),"" );
}}
2.5编写ShiroConfig类(注意此处的注解)
package com.example.demo.config;
import org.apache.shiro.spring.web.ShiroFilterFactoryBean;
import org.apache.shiro.web.mgt.DefaultWebSecurityManager;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import java.util.LinkedHashMap;
import java.util.Map;
@Configuration
public class ShiroConfig {
@Bean
public ShiroFilterFactoryBean getShiroFilterFactoryBean(@Qualifier("Manager") DefaultWebSecurityManager SecurityManager)
{
ShiroFilterFactoryBean bean = new ShiroFilterFactoryBean ( );
bean.setSecurityManager ( SecurityManager );
//拦截
Map<String, String> filterMap=new LinkedHashMap <> ();
//授权,未授权报401错误,
//perms[user:add],请详细看quick start shiro
filterMap.put ( "/add","perms[user:add]" );
filterMap.put ( "/update","perms[user:update]" );
bean.setFilterChainDefinitionMap ( filterMap );
//未授权跳转界面
bean.setUnauthorizedUrl("/noauth");
return bean;
}
@Bean (name="Manager")
public DefaultWebSecurityManager getDefaultWebSecurityManager(@Qualifier("userRelam") UserRelam userRelam){
DefaultWebSecurityManager SecurityManager = new DefaultWebSecurityManager ( );
SecurityManager.setRealm (userRelam);
return SecurityManager;
}
//自定义了一个UserRelam(可以自己去看看quick start shiro中的例子)
@Bean
public UserRelam userRelam()
{
return new UserRelam ();
}
}
2.6编写MyController类
package com.example.demo.controller;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.IncorrectCredentialsException;
import org.apache.shiro.authc.UnknownAccountException;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.subject.Subject;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
public class MyController {
@RequestMapping("/index")
public String show(Model model){
model.addAttribute ( "msg","错误" );
return "index";
}
@RequestMapping("/add")
public String add(){
return "user/add";
}
@RequestMapping("/login")
public String login()
{
return "login";
}
@RequestMapping("/update")
public String update(){
return "user/update";
}
@RequestMapping("/user/login")
public String login(String username,String password){
System.out.println ("这里" );
//获取当前登录用户
Subject subject = SecurityUtils.getSubject ( );
//封装用户的数据
UsernamePasswordToken token = new UsernamePasswordToken ( username, password );
try{
subject.login ( token );
return "index";
}
catch (UnknownAccountException e){
return "login";
}
catch (IncorrectCredentialsException e){
return "login";
}
}
@RequestMapping("noauth") //未授权,跳转界面
@ResponseBody //将返回值以json形式返回到界面
public String noauth()
{
return "未经授权,不予访问";
}
}