pom文件

 <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>
        <!--lombok-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>

        <dependency>
            <groupId>org.apache.tomcat.embed</groupId>
            <artifactId>tomcat-embed-jasper</artifactId>
        </dependency>
        <dependency>
            <groupId>jstl</groupId>
            <artifactId>jstl</artifactId>
            <version>1.2</version>
        </dependency>
        <dependency>
            <groupId>org.apache.shiro</groupId>
            <artifactId>shiro-spring-boot-starter</artifactId>
            <version>1.7.0</version>
        </dependency>
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.1.4</version>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.1.22</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.46</version>
        </dependency>

配置文件

mybatis.type-aliases-package=com.demo.entity
mybatis.mapper-locations=classpath:mapper/**.xml
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.username=
spring.datasource.password=
spring.datasource.url=

实体类

/**
 * (EUser)表实体类
 *
 * @author demo
 * @since 2021-01-19 13:54:35
 */
@Data
@Accessors(chain = true)
@AllArgsConstructor
@NoArgsConstructor
@ApiModel(value = "用户对象")
public class EUser extends Model<EUser> {

    private Integer uId;

    private String uNo;

    private Integer uRole;

    private String uUsername;

    private String uPassword;

    private String uHomeAddress;

    private String uNowAddress;

    private String uPhone;

    private String uSalt;

    private Date uCreateTime;

    private Date uUpdateTime;

}
/**
 * (ERole)表实体类
 *
 * @author demo
 * @since 2021-01-19 13:54:26
 */
@Data
@Accessors(chain = true)
@AllArgsConstructor
@NoArgsConstructor
public class ERole extends Model<ERole> {

    private Integer rId;

    private String eName;

    private List<EPerms> perms;

}

控制层

    @ApiOperation("用户注册")
    @PostMapping("register")
    public ApiRestResponse register(@RequestBody EUser eUser){
        try {
            eUserService.register(eUser);
            return ApiRestResponse.success();
        } catch (Exception e) {
            e.printStackTrace();
            return ApiRestResponse.error(MyExceptionEnum.REGISTE_FAIL);
        }
    }

@ApiOperation("用户登录")
    @PostMapping("login")
    public ApiRestResponse login(String username,String password){
        //获取主体对象
        Subject subject = SecurityUtils.getSubject();
        try {
            subject.login(new UsernamePasswordToken(username,password));
            return ApiRestResponse.success();
        } catch (UnknownAccountException e) {
            e.printStackTrace();
            return ApiRestResponse.error(MyExceptionEnum.WRONG_USERNAME);
        } catch (IncorrectCredentialsException e){
            e.printStackTrace();
            return ApiRestResponse.error(MyExceptionEnum.WRONG_PASSWORD);
        }
    }

    @ApiOperation("退出登陆")
    @RequestMapping("logout")
    public ApiRestResponse logout(){
        Subject subject = SecurityUtils.getSubject();
        subject.logout();
        return ApiRestResponse.success();
    }

业务逻辑层

    public void register(EUser eUser) {
        //处理业务
        //md5+dalt+hash散列
        String salt = SaltUtils.getSalt(8);
        eUser.setUSalt(salt);
        Md5Hash md5Hash = new Md5Hash(eUser.getUPassword(),salt,1024);
        eUser.setUPassword(md5Hash.toHex());
        eUserDao.insert(eUser);
    }

    @Autowired(required = false)
    private ERoleDao eRoleDao;

    @Override
    public List<ShiroPerms> findPermsByRoleId(Integer id) {
        return eRoleDao.findPermsByRoleId(id);
    }

realm中的授权

public class CustomerRealm extends AuthorizingRealm {

    //授权
    @Override
    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
        String primaryPrincipal = (String) principalCollection.getPrimaryPrincipal();
        EUserService eUserService = (EUserService) ApplicationContextUtils.getBean("eUserService");
        ERoleService eRoleService = (ERoleService) ApplicationContextUtils.getBean("eRoleService");
        ShiroUser shiroUser = eUserService.findRolesByUserName(primaryPrincipal);
        //授权角色信息
        if (!CollectionUtils.isEmpty(shiroUser.getRoles())){
            SimpleAuthorizationInfo simpleAuthorizationInfo = new SimpleAuthorizationInfo();
            shiroUser.getRoles().forEach(shiroRole -> {
                simpleAuthorizationInfo.addRole(shiroRole.getRName());
                //权限信息
                List<ShiroPerms> perms = eRoleService.findPermsByRoleId(shiroRole.getRId());
                if (!CollectionUtils.isEmpty(perms)){
                    perms.forEach(shiroPerms -> {
                        simpleAuthorizationInfo.addStringPermission(shiroPerms.getPName());
                    });
                }
            });
            return simpleAuthorizationInfo;
        }
        return null;
    }

    //验证
    @Override
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {
        String principal = (String) authenticationToken.getPrincipal();
        EUserService eUserService = (EUserService) ApplicationContextUtils.getBean("eUserService");
        EUser shiroUser = eUserService.findByUserName(principal);
        if(!ObjectUtils.isEmpty(shiroUser)){
            return new SimpleAuthenticationInfo(shiroUser.getUUsername(),shiroUser.getUPassword(),
                    ByteSource.Util.bytes(shiroUser.getUSalt()),this.getName());
        }
        return null;
    }
}

且视他人之疑目如盏盏鬼火,大胆去走自己的夜路。