springboot整合shiro定义用户认证授权微服务
1、所谓的用户微服务指的是要求在“microboot-shiro-member-provider”里面进肤悦行实现,改服务之中需要考虑如下的几点:
1、该服务需要进行数据库的开发,所以一定要进行数据库连接池的配置。
2、既然要进行微服务的编写,那么就一定需要提供有业务接口以及DAO实现子类,现在的实现将依靠Mybatis完成。
3、所有的微服务最终要通过控制器的Rest进行发布处理。
【microboot-shiro-member-provider】配置druid数据库连接池;
需要修改pom.xml配置文件,吩罩侧为项目的整合添加相关的支持包;
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>SpringBoot</artifactId>
<groupId>com.gwolf</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<groupId>com.gwolf</groupId>
<artifactId>microboot-shiro-member-provider</artifactId>
<packaging>jar</packaging>
<name>microboot-member-provider</name>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>com.gwolf</groupId>
<artifactId>microboot-shiro-api</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>springloaded</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</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-aop</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.0.4</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.0</version>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.0</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
</project>

2、【microboot-shiro-member-provider】建立几个DAO接口:
提供用户认证的DAO接口:IMemberDAO;
package com.gwolf.dao;
import com.gwolf.vo.Member;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface IMemberDAO {
public Member findById(String mid);
}
3、提供角色检测的IRoleDAO接口:
package com.gwolf.dao;
import org.apache.ibatis.annotations.Mapper;
import java.util.Set;
@Mapper
public interface IRoleDAO {
public Set<String> findAllRoleByMember(String mid);
}

4、提供所有权限检测的IActionDAO接口:
package com.gwolf.dao;
import org.apache.ibatis.annotations.Mapper;
import java.util.Set;
@Mapper
public interface IActionDAO {
public Set<String> findAllActionByMember(String mid);
}

5、【microboot-shiro-member-provider】将mybatis的配置文件拷贝到项目的"src/main/resources"下:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!-- 进行Mybatis的相应的环境的属性定义 -->
<settings>
<!-- 在本项目之中开启二级缓存 -->
<setting name="cacheEnabled" value="true"/>
</settings>
</configuration>

6、配置mybatis/mapper/com/gwolf/MemberMapper.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.gwolf.dao.IMemberDAO">
<!-- 根据身份信息取得密码进行认证 -->
<select id="findById" parameterType="String" resultType="Member">
select mid,password,name from member where mid=#{mid}
</select>
</mapper>

7、配置mybatis/mapper/com/gwolf/RoleMapper.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.gwolf.dao.IRoleDAO">
<select id="findAllRoleByMember" parameterType="String" resultType="String">
select flag from role where rid in
(select rid from member_role where mid=#{mid})
</select>
</mapper>

8、配置mybatis/mapper/com/gwolf/ActionMapper.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.gwolf.dao.IActionDAO">
<select id="findAllActionByMember" parameterType="String" resultType="String">
select flag from action where actid in
(select actid from role_action where rid
in(select rid from member_role where mid=#{mid}))
</select>
</mapper>

9、【microboot-shiro-member-provider】修改application.yml配置文件:
server:
port: 8080
spring:
messages:
basename: i18n/Message,i18n/Pages #资源文件的名称
datasource:
#配置当前要使用的数据源的操作类型
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: org.gjt.mm.mysql.Driver
url: jdbc:mysql://localhost:3306/shirodb
username: root
password: root
filters: stat,wall,log4j
dbcp2:
min-idle: 5
initial-size: 5
max-total: 5
max-wait-millis: 200
mybatis:
config-location: classpath:mybatis/mybatis.cfg.xml
type-aliases-package: com.gwolf.vo
mapper-locations:
- classpath:mybatis/mapper/**/*.xml

10、【microboot-shiro-member-provider】定义IMemberService业务接口:
package com.gwolf.service.impl;
import com.gwolf.dao.IActionDAO;
import com.gwolf.dao.IMemberDAO;
import com.gwolf.dao.IRoleDAO;
import com.gwolf.service.IMemberService;
import com.gwolf.vo.Member;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
@Service
public class MemberServiceImpl implements IMemberService{
@Resource
private IMemberDAO memberDAO;
@Resource
private IRoleDAO roleDAO;
@Resource
private IActionDAO actionDAO;
@Override
public Member get(String mid) throws Exception {
return this.memberDAO.findById(mid);
}
@Override
public Map<String, Set<String>> listAuthByMember(String mid) throws Exception {
Map<String,Set<String>> map = new HashMap<String,Set<String>>();
map.put("allRoles", this.roleDAO.findAllRoleByMember(mid));
map.put("allActions", this.actionDAO.findAllActionByMember(mid));
return map;
}
}

11、【microboot-shiro-member-provider】编写业务层功能测试代码类:
package com.gwolf.test;
import com.gwolf.StartSpringBootMain;
import com.gwolf.service.IDeptService;
import com.gwolf.service.IMemberService;
import com.gwolf.vo.Dept;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.web.WebAppConfiguration;
import javax.annotation.Resource;
@SpringBootTest(classes = StartSpringBootMain.class)
@RunWith(SpringJUnit4ClassRunner.class)
@WebAppConfiguration
public class TestMemberService {
@Resource
private IMemberService memberService;
@Test
public void testGet() throws Exception{
System.out.print(memberService.get("admin"));
}
@Test
public void testAuth() throws Exception{
System.out.print(memberService.listAuthByMember("admin"));
}
}

12、【microboot-shiro-member-provider】进行控制层编写,控制层现在给出的一定是Rest服务:
package com.gwolf.controller;
import com.gwolf.service.IMemberService;
import com.gwolf.util.controller.AbstractBaseController;
import com.gwolf.vo.Member;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.stereotype.Service;
import org.springframework.validation.BindingResult;
import org.springframework.validation.ObjectError;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import javax.validation.Valid;
import java.util.Iterator;
@Controller
public class MemberController extends AbstractBaseController{
@Autowired
private IMemberService memberService;
@RequestMapping(value="/member/get", method = RequestMethod.POST)
@ResponseBody
public Object get(String mid) {
try {
return this.memberService.get(mid);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
@RequestMapping(value="/member/auth", method = RequestMethod.POST)
@ResponseBody
public Object auth(String mid) {
try {
return this.memberService.listAuthByMember(mid);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}

13、【microboot-shiro-member-provider】编写控制层测试,如果要访问Rest服务肯定要使用RestTemplate完成,这个类为了简单使用,直接进行对象实例化处理。
package com.gwolf.test;
import com.gwolf.StartMemberSpringBootMain;
import com.gwolf.vo.Member;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.web.WebAppConfiguration;
import org.springframework.web.client.RestTemplate;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
@SpringBootTest(classes = StartMemberSpringBootMain.class)
@RunWith(SpringJUnit4ClassRunner.class)
@WebAppConfiguration
public class TestMemberController {
private RestTemplate restTemplate = new RestTemplate();
@Test
public void testGet() throws Exception{
Member member = restTemplate.postForObject("http://localhost:8080/member/get?mid=admin",
null, Member.class);
System.out.println(member);
}
@Test
public void testAuth() throws Exception{
Map<String,Object> map = restTemplate.postForObject("http://localhost:8080/member/auth?mid=admin",
null, Map.class);
Set<String> allRoles = new HashSet<String>();
allRoles.addAll((List<String>)map.get("allRoles"));
System.out.println(map);
}
}

14、那么此时一个专门进行用户认证以及授权检测的微服务实现开发完成了。