前提:
本文主要讲解Spring Boot 与 Shiro的集成 与权限控制的实现方式(主要以代码实现功能为主),主要用到的技术Spring Boot+Shiro+Jpa(通过Maven构建),并不会涉及到Shiro框架的源码分析
如果有想要学习Shiro框架的小伙伴可以去http://shiro.apache.org/官网自行学习,并推荐一个中文学习Shiro的网站https://www.sojson.com/shiro(感觉挺不错的)
需求说明:
通过SpringBoot+Shiro实现用户登录验证,授权,对不同用户角色访问资源进行验证,对用户权限访问资源验证,通过迭代加密方式提高用户密码的安全性
用户 and 角色表关系 多对多
角色 and 权限表关系 多对多
废话不多说直接上代码:
此项目是Maven多模块项目 码云地址 https://gitee.com/h-java/springboot-parent-demo
小伙伴们代码里的注释我已经写的很详细了,所以博客里不做讲解,直接看代码注释讲解就可以了
SQL文件


- /*Navicat MySQL Data Transfer
-
- Source Server : localhost
- Source Server Version : 50520
- Source Host : localhost:3306
- Source Database : shiro-demo
-
- Target Server Type : MYSQL
- Target Server Version : 50520
- File Encoding : 65001
-
- Date: 2018-11-15 16:59:02*/SET FOREIGN_KEY_CHECKS=0;-- ----------------------------
- -- Table structure for hibernate_sequence-- ----------------------------DROP TABLE IF EXISTS `hibernate_sequence`;
- CREATE TABLE `hibernate_sequence` (
- `next_val` bigint(20) DEFAULT NULL
- ) ENGINE=MyISAM DEFAULT CHARSET=utf8;-- ----------------------------
- -- Records of hibernate_sequence-- ----------------------------INSERT INTO `hibernate_sequence` VALUES ('4');
- INSERT INTO `hibernate_sequence` VALUES ('4');
- INSERT INTO `hibernate_sequence` VALUES ('4');-- ----------------------------
- -- Table structure for permission_t-- ----------------------------DROP TABLE IF EXISTS `permission_t`;
- CREATE TABLE `permission_t` (
- `id` int(11) NOT NULL,
- `name` varchar(255) DEFAULT NULL,
- PRIMARY KEY (`id`)
- ) ENGINE=MyISAM DEFAULT CHARSET=utf8;-- ----------------------------
- -- Records of permission_t-- ----------------------------INSERT INTO `permission_t` VALUES ('1', 'Retrieve');
- INSERT INTO `permission_t` VALUES ('2', 'Create');
- INSERT INTO `permission_t` VALUES ('3', 'Update');
- INSERT INTO `permission_t` VALUES ('4', 'Delete');-- ----------------------------
- -- Table structure for role-- ----------------------------DROP TABLE IF EXISTS `role`;
- CREATE TABLE `role` (
- `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
- `role` varchar(255) DEFAULT NULL,
- PRIMARY KEY (`id`)
- ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;-- ----------------------------
- -- Records of role-- ----------------------------INSERT INTO `role` VALUES ('1', 'user');
- INSERT INTO `role` VALUES ('2', 'admin');-- ----------------------------
- -- Table structure for role_permission_t-- ----------------------------DROP TABLE IF EXISTS `role_permission_t`;
- CREATE TABLE `role_permission_t` (
- `pid` int(11) NOT NULL,
- `rid` int(11) NOT NULL,
- KEY `FKt2l638rvh84yplqqu7odiwhdx` (`rid`),
- KEY `FKh946y0ynuov5ynnrn024vapg9` (`pid`)
- ) ENGINE=MyISAM DEFAULT CHARSET=utf8;-- ----------------------------
- -- Records of role_permission_t-- ----------------------------INSERT INTO `role_permission_t` VALUES ('1', '1');
- INSERT INTO `role_permission_t` VALUES ('1', '2');
- INSERT INTO `role_permission_t` VALUES ('2', '2');
- INSERT INTO `role_permission_t` VALUES ('3', '2');
- INSERT INTO `role_permission_t` VALUES ('1', '3');
- INSERT INTO `role_permission_t` VALUES ('2', '3');
- INSERT INTO `role_permission_t` VALUES ('3', '3');
- INSERT INTO `role_permission_t` VALUES ('4', '3');-- ----------------------------
- -- Table structure for role_t-- ----------------------------DROP TABLE IF EXISTS `role_t`;
- CREATE TABLE `role_t` (
- `id` int(11) NOT NULL,
- `role` varchar(255) DEFAULT NULL,
- PRIMARY KEY (`id`)
- ) ENGINE=MyISAM DEFAULT CHARSET=utf8;-- ----------------------------
- -- Records of role_t-- ----------------------------INSERT INTO `role_t` VALUES ('1', 'guest');
- INSERT INTO `role_t` VALUES ('2', 'user');
- INSERT INTO `role_t` VALUES ('3', 'admin');-- ----------------------------
- -- Table structure for user-- ----------------------------DROP TABLE IF EXISTS `user`;
- CREATE TABLE `user` (
- `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
- `username` varchar(255) DEFAULT NULL,
- `password` varchar(255) DEFAULT NULL,
- `role` varchar(255) DEFAULT NULL,
- PRIMARY KEY (`id`)
- ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;-- ----------------------------
- -- Records of user-- ----------------------------INSERT INTO `user` VALUES ('1', 'howie', '123456', 'user');
- INSERT INTO `user` VALUES ('2', 'swit', '123456789', 'admin');-- ----------------------------
- -- Table structure for user_role_t-- ----------------------------DROP TABLE IF EXISTS `user_role_t`;
- CREATE TABLE `user_role_t` (
- `rid` int(11) NOT NULL,
- `uid` bigint(20) NOT NULL,
- KEY `FKe6b6umcoegdbmjws9e9y0n2jj` (`uid`),
- KEY `FK8lhd80hb3gbdbvdmlkn2oyprl` (`rid`)
- ) ENGINE=MyISAM DEFAULT CHARSET=utf8;-- ----------------------------
- -- Records of user_role_t-- ----------------------------INSERT INTO `user_role_t` VALUES ('3', '2');
- INSERT INTO `user_role_t` VALUES ('2', '1');
- INSERT INTO `user_role_t` VALUES ('1', '3');-- ----------------------------
- -- Table structure for user_t-- ----------------------------DROP TABLE IF EXISTS `user_t`;
- CREATE TABLE `user_t` (
- `id` bigint(20) NOT NULL,
- `password` varchar(255) DEFAULT NULL,
- `salt` varchar(255) DEFAULT NULL,
- `username` varchar(255) DEFAULT NULL,
- PRIMARY KEY (`id`)
- ) ENGINE=MyISAM DEFAULT CHARSET=utf8;-- ----------------------------
- -- Records of user_t-- ----------------------------INSERT INTO `user_t` VALUES ('1', 'dd531568fac3d2338bdba66b46b39fd7', '73ee684dd5a07e3b9034b02dcebf4e7c', 'hly');
- INSERT INTO `user_t` VALUES ('2', '7f5e269e2f52955a0bbdfdef19281fd4', 'c6dc702282fd467c2c5481617c45a014', 'dxl');
- INSERT INTO `user_t` VALUES ('3', 'edec83e7318071af89c8811536fd0a68', 'be535103fe5f98c4cef83cf24ab0d11b', 'zy');
View Code
父POM文件:
- 1 <?xml version="1.0" encoding="UTF-8"?> 2 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 3 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4 <modelVersion>4.0.0</modelVersion> 5 6 <groupId>com.boot</groupId> 7 <artifactId>springboot-parent-demo</artifactId> 8 <version>0.0.1-SNAPSHOT</version> 9 <packaging>pom</packaging>10 11 <name>springboot-parent-demo</name>12 <description>Spring Boot Parent Demo</description>13 14 <parent>15 <groupId>org.springframework.boot</groupId>16 <artifactId>spring-boot-starter-parent</artifactId>17 <version>2.0.5.RELEASE</version>18 <relativePath/> <!-- lookup parent from repository -->19 </parent>20 21 <!--编码-->22 <properties>23 <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>24 <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>25 <java.version>1.8</java.version>26 </properties>27 28 <!--子模块-->29 <modules>30 <module>sb-listener</module>31 <module>sb-configration-file</module>32 <module>sb-shiro</module>33 <module>sb-shiro2</module>34 </modules>35 36 <!-- 版本说明:这里统一管理依赖的版本号 -->37 <dependencyManagement>38 <dependencies>39 <dependency>40 <groupId>com.example</groupId>41 <artifactId>sb-listener</artifactId>42 <version>0.0.1-SNAPSHOT</version>43 </dependency>44 </dependencies>45 </dependencyManagement>46 47 <!--父依赖-->48 <dependencies>49 <dependency>50 <groupId>org.springframework.boot</groupId>51 <artifactId>spring-boot-starter-thymeleaf</artifactId>52 </dependency>53 <dependency>54 <groupId>org.springframework.boot</groupId>55 <artifactId>spring-boot-starter-web</artifactId>56 </dependency>57 58 <dependency>59 <groupId>org.projectlombok</groupId>60 <artifactId>lombok</artifactId>61 <optional>true</optional>62 </dependency>63 <dependency>64 <groupId>org.springframework.boot</groupId>65 <artifactId>spring-boot-starter-test</artifactId>66 <scope>test</scope>67 </dependency>68 </dependencies>69 70 <!--插件依赖-->71 <build>72 <plugins>73 <plugin>74 <groupId>org.springframework.boot</groupId>75 <artifactId>spring-boot-maven-plugin</artifactId>76 </plugin>77 </plugins>78 </build>79 80 81 </project>
子模块项目sb-shiro2的POM文件:
- <?xml version="1.0" encoding="UTF-8"?>
- <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">
- <modelVersion>4.0.0</modelVersion>
-
- <groupId>com.example</groupId>
- <artifactId>sb-shiro2</artifactId>
- <version>0.0.1-SNAPSHOT</version>
- <packaging>jar</packaging>
-
- <name>sb-shiro2</name>
- <description>Spring Boot Shiro Demo 2</description>
-
- <parent>
- <groupId>com.boot</groupId>
- <artifactId>springboot-parent-demo</artifactId>
- <version>0.0.1-SNAPSHOT</version>
- </parent>
-
- <dependencies>
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-data-jpa</artifactId>
- </dependency>
- <dependency>
- <groupId>org.apache.shiro</groupId>
- <artifactId>shiro-spring</artifactId>
- <version>1.4.0</version>
- </dependency>
-
- <dependency>
- <groupId>com.alibaba</groupId>
- <artifactId>druid</artifactId>
- <version>1.0.19</version>
- </dependency>
-
- <dependency>
- <groupId>mysql</groupId>
- <artifactId>mysql-connector-java</artifactId>
- </dependency>
- </dependencies>
-
- <build>
- <plugins>
- <plugin>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-maven-plugin</artifactId>
- </plugin>
- </plugins>
- </build>
-
-
- </project>
整体项目结构:

application.yml


- server:
- port: 8088spring:
- application:
- name: shiro
- datasource:
- url: jdbc:mysql://localhost:3306/shiro-demo username: root
- password: 123456 driver-class-name: com.mysql.jdbc.Driver
- jpa:
- database: mysql
- showSql: true hibernate:
- ddlAuto: update
- properties:
- hibernate:
- dialect: org.hibernate.dialect.MySQL5Dialect
- format_sql: true
View Code
entity包
通过Jpa生成数据库表
User类


- package com.example.demo.entity;import lombok.Data;import javax.persistence.*;import java.io.Serializable;import java.util.List;/**
- * Created by hly on 2018\11\14 0014. */@Data
- @Entity
- @Table(name = "user_t") //数据库生成的表名public class User implements Serializable{private static final long serialVersionUID = 6469007496170509665L;/** * 用户id */@Id
- @GeneratedValueprivate long id;/** * 用户名 */private String username;/** * 用户密码 */private String password;/** * yan */private String salt;/** * 用户表和角色表的多对多关联 */@ManyToMany(fetch = FetchType.EAGER)
- @JoinTable(name = "user_role_t",joinColumns = {@JoinColumn(name = "uid")},
- inverseJoinColumns = {@JoinColumn(name = "rid")})private List<SysRole> roles;/** * 对盐进行再次加密
- * @return */public String getCredentialsSalt() {return username + salt + salt;
- }
-
- }
View Code
SysRole类


- package com.example.demo.entity;import lombok.Data;import javax.persistence.*;import java.io.Serializable;import java.util.List;/**
- * Created by hly on 2018\11\14 0014. */@Data
- @Entity
- @Table(name = "role_t")public class SysRole implements Serializable {private static final long serialVersionUID = 8215278487246865520L;/** * 角色id */@Id
- @GeneratedValueprivate Integer id;/** * 角色名称 */private String role;/** * 权限与用户的多对多关联 */@ManyToMany
- @JoinTable(name = "user_role_t",joinColumns = {@JoinColumn(name = "rid")},
- inverseJoinColumns = {@JoinColumn(name = "uid")})
- List<User> users;/** * 角色与权限的多对多关联 */@ManyToMany(fetch = FetchType.EAGER)
- @JoinTable(name = "role_permission_t",joinColumns = {@JoinColumn(name = "rid")},
- inverseJoinColumns = {@JoinColumn(name = "pid")})
- List<SysPermission> permissions ;
-
- }
View Code
SysPermission类


- package com.example.demo.entity;import lombok.Data;import javax.persistence.*;import java.io.Serializable;import java.util.List;/**
- * Created by hly on 2018\11\14 0014. */@Data
- @Entity
- @Table(name = "role_t")public class SysRole implements Serializable {private static final long serialVersionUID = 8215278487246865520L;/** * 角色id */@Id
- @GeneratedValueprivate Integer id;/** * 角色名称 */private String role;/** * 权限与用户的多对多关联 */@ManyToMany
- @JoinTable(name = "user_role_t",joinColumns = {@JoinColumn(name = "rid")},
- inverseJoinColumns = {@JoinColumn(name = "uid")})
- List<User> users;/** * 角色与权限的多对多关联 */@ManyToMany(fetch = FetchType.EAGER)
- @JoinTable(name = "role_permission_t",joinColumns = {@JoinColumn(name = "rid")},
- inverseJoinColumns = {@JoinColumn(name = "pid")})
- List<SysPermission> permissions ;
-
- }
View Code
mapper接口


- package com.example.demo.dao;import com.example.demo.entity.User;import org.springframework.data.jpa.repository.JpaRepository;/**
- * Created by hly on 2018\11\14 0014. */public interface UserMapper extends JpaRepository<User,Long>{
- User findUserByUsername(String username);
- }
View Code
UserService


- package com.example.demo.service;import com.example.demo.dao.UserMapper;import com.example.demo.entity.User;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Service;/**
- * Created by hly on 2018\11\14 0014. */@Servicepublic class UserService {
-
- @Autowiredprivate UserMapper userMapper;public User findUserByName(String username){return userMapper.findUserByUsername(username);
- }public User saveUser(User user){return userMapper.save(user);
- }
- }
View Code
Shiro包
ShiroConfig


- package com.example.demo.shiro;import org.apache.shiro.authc.credential.HashedCredentialsMatcher;import org.apache.shiro.mgt.SecurityManager;import org.apache.shiro.spring.web.ShiroFilterFactoryBean;import org.apache.shiro.web.mgt.DefaultWebSecurityManager;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import java.util.HashMap;import java.util.Map;/**
- * Created by hly on 2018\11\14 0014. */@Configurationpublic class ShiroConfig {// shiro filter @Beanpublic ShiroFilterFactoryBean shirFilter(SecurityManager securityManager) {
- ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();
- shiroFilterFactoryBean.setSecurityManager(securityManager);
-
- Map<String, String> filterChainDefinitionMap = new HashMap<String, String>();//登录界面,没有登录的用户访问授权的界面就会跳转到该界面shiroFilterFactoryBean.setLoginUrl("/login");//没有授权的资源,都可以访问,用户访问授权的资源无权限时跳转到该界面shiroFilterFactoryBean.setUnauthorizedUrl("/unauthc");
- shiroFilterFactoryBean.setSuccessUrl("/home/index");//所有路径都拦截filterChainDefinitionMap.put("/*", "anon");//授权资源,只有登录了才能访问,并且有该对应权限的用户才可以访问filterChainDefinitionMap.put("/authc/index", "authc");
- filterChainDefinitionMap.put("/authc/admin", "roles[admin]");
- filterChainDefinitionMap.put("/authc/renewable", "perms[Create,Update]");
- filterChainDefinitionMap.put("/authc/removable", "perms[Delete]");
- filterChainDefinitionMap.put("/authc/retrievable", "perms[Retrieve]");
- shiroFilterFactoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap);
- System.out.println("shirFilter配置成功");return shiroFilterFactoryBean;
- }//授权管理者 @Beanpublic SecurityManager securityManager() {
- DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
- securityManager.setRealm(shiroRealm());return securityManager;
- }//shiro realm @Beanpublic EnceladusShiroRealm shiroRealm() {
- EnceladusShiroRealm shiroRealm = new EnceladusShiroRealm();
- shiroRealm.setCredentialsMatcher(hashedCredentialsMatcher());return shiroRealm;
- }//设置算法和迭代 @Beanpublic HashedCredentialsMatcher hashedCredentialsMatcher() {
- HashedCredentialsMatcher hashedCredentialsMatcher = new HashedCredentialsMatcher();
- hashedCredentialsMatcher.setHashAlgorithmName(PasswordHelper.ALGORITHM_NAME);// 散列算法hashedCredentialsMatcher.setHashIterations(PasswordHelper.HASH_ITERATIONS);// 散列次数return hashedCredentialsMatcher;
- }//密码加密 @Beanpublic PasswordHelper passwordHelper() {return new PasswordHelper();
- }
- }
View Code
EnceladusShiroRealm


- package com.example.demo.shiro;import com.example.demo.entity.SysPermission;import com.example.demo.entity.SysRole;import com.example.demo.entity.User;import com.example.demo.service.UserService;import org.apache.shiro.authc.AuthenticationException;import org.apache.shiro.authc.AuthenticationInfo;import org.apache.shiro.authc.AuthenticationToken;import org.apache.shiro.authc.SimpleAuthenticationInfo;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.util.ByteSource;import org.springframework.beans.factory.annotation.Autowired;/**
- * Created by hly on 2018\11\14 0014.
- * shiro中用户自定义登录验证和授权认证的地方(realm) */public class EnceladusShiroRealm extends AuthorizingRealm{
-
- @Autowiredprivate UserService userService;/** * 授权认证
- * @param principal
- * @return */@Overrideprotected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principal) {//负责装载role和permission的对象SimpleAuthorizationInfo authorizationInfo = new SimpleAuthorizationInfo();//获取用户名String username = (String) principal.getPrimaryPrincipal();//获取用户User user = userService.findUserByName(username);//遍历角色和权限,并把名称加入到authorizationInfo中for (SysRole role:user.getRoles()) {
- authorizationInfo.addRole(role.getRole());for(SysPermission permission:role.getPermissions()) {
- authorizationInfo.addStringPermission(permission.getName());
- }
- }return authorizationInfo;
- }/** * 登录验证
- * @param token
- * @return * @throws AuthenticationException */@Overrideprotected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {//获取用户名String username = (String)token.getPrincipal();//查寻用户User user = userService.findUserByName(username);//逻辑if (user == null) {return null;
- }//包装对象(用户名、密码、用户Salt、抽象类CachingRealm的getName())SimpleAuthenticationInfo authenticationInfo = new SimpleAuthenticationInfo(user.getUsername(),user.getPassword(),
- ByteSource.Util.bytes(user.getCredentialsSalt()),getName());
- System.out.println("getName():"+getName());//返回SimpleAuthenticationInfo对象return authenticationInfo;
- }
- }
View Code
PasswordHelper


- package com.example.demo.shiro;import com.example.demo.entity.User;import org.apache.shiro.crypto.RandomNumberGenerator;import org.apache.shiro.crypto.SecureRandomNumberGenerator;import org.apache.shiro.crypto.hash.SimpleHash;import org.apache.shiro.util.ByteSource;/**
- * Created by hly on 2018\11\14 0014.
- * 对密码进行迭代加密,保证用户密码的安全 */public class PasswordHelper {//安全的随机字符private RandomNumberGenerator randomNumberGenerator = new SecureRandomNumberGenerator();//算法名称public static final String ALGORITHM_NAME = "md5";//迭代次数public static final int HASH_ITERATIONS = 2;public void encryptPassword(User user) {//随机字符串作为用户的Salt user.setSalt(randomNumberGenerator.nextBytes().toHex());//算法、用户密码、用户Salt、迭代次数String newPassword = new SimpleHash(ALGORITHM_NAME,user.getPassword(),
- ByteSource.Util.bytes(user.getCredentialsSalt()),HASH_ITERATIONS).toHex();//对用户设置新密码 user.setPassword(newPassword);
- }
-
-
- }
View Code
Controller包
AuthcController


- package com.example.demo.controller;import com.example.demo.entity.User;import org.apache.shiro.SecurityUtils;import org.apache.shiro.subject.Subject;import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RestController;/**
- * 验证的接口 */@RestController
- @RequestMapping("authc")public class AuthcController {
-
- @GetMapping("index")public Object index() {
- Subject subject = SecurityUtils.getSubject();
- User user = (User) subject.getSession().getAttribute("user");return user.toString();
- }
-
- @GetMapping("admin")public Object admin() {return "Welcome Admin";
- }// delete@GetMapping("removable")public Object removable() {return "removable";
- }// creat & update@GetMapping("renewable")public Object renewable() {return "renewable";
- }
-
- @GetMapping("retrievable")public Object retrievable() {return "retrievable";}
-
- }
View Code
HomeController


- package com.example.demo.controller;import com.example.demo.entity.User;import com.example.demo.service.UserService;import com.example.demo.shiro.PasswordHelper;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.beans.factory.annotation.Autowired;import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RequestParam;import org.springframework.web.bind.annotation.RestController;/**
- * 不验证的接口 */@RestController
- @RequestMappingpublic class HomeController {
-
- @Autowiredprivate UserService userService;
-
- @Autowiredprivate PasswordHelper passwordHelper;
-
- @GetMapping("/login")public Object login() {return "Here is Login page";
- }
-
- @GetMapping("/unauthc")public Object unauthc() {return "Here is Unauthc page";
- }
-
- @GetMapping("doLogin")public Object doLogin(@RequestParam String username, @RequestParam String password) {
- UsernamePasswordToken token = new UsernamePasswordToken(username, password);
- Subject subject = SecurityUtils.getSubject();try {
- subject.login(token);
- } catch (IncorrectCredentialsException ice) {return "password error!";
- } catch (UnknownAccountException uae) {return "username error!";
- }
-
- User user = userService.findUserByName(username);
- subject.getSession().setAttribute("user", user);return "SUCCESS";
- }
-
- @GetMapping("/register")public Object register(@RequestParam String username, @RequestParam String password) {
- User user = new User();
- user.setUsername(username);
- user.setPassword(password);
- passwordHelper.encryptPassword(user);
-
- userService.saveUser(user);return "注册用户SUCCESS";
- }
- }
View Code
之后运行项目通过rest接口测试
- localhost:8088/login
- localhost:8088/unauthc
- localhost:8088/doLogin?username=hly&password=123等等通过controller里的接口进行运行测试就好了,看运行效果,我就不一一往下copy了