From 78a062e2346268c31be82ca9e39e1eecef26972d Mon Sep 17 00:00:00 2001 From: Junling Bu Date: Mon, 31 Dec 2018 23:21:31 +0800 Subject: [PATCH] =?UTF-8?q?feat[litemall-admin,=20litemall-admin-api,=20li?= =?UTF-8?q?temall-core]=EF=BC=9A=E5=BC=95=E5=85=A5shiro=E5=BA=93=EF=BC=8C?= =?UTF-8?q?=E4=BB=A3=E6=9B=BF=E5=8E=9F=E6=9D=A5=E7=9A=84=E7=99=BB=E9=99=86?= =?UTF-8?q?=E8=AE=A4=E8=AF=81=E6=9C=BA=E5=88=B6=EF=BC=8C=E4=BD=86=E6=98=AF?= =?UTF-8?q?=E8=BF=98=E4=B8=8D=E6=94=AF=E6=8C=81=E6=8E=88=E6=9D=83=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- litemall-admin-api/pom.xml | 5 ++ ...ginAdminHandlerMethodArgumentResolver.java | 15 ++-- .../litemall/admin/config/ShiroConfig.java | 76 +++++++++++++++++ .../litemall/admin/dao/AdminToken.java | 42 ---------- .../admin/service/AdminTokenManager.java | 58 ------------- .../litemall/admin/shiro/ShiroAdminRealm.java | 69 ++++++++++++++++ .../admin/shiro/ShiroWebSessionManager.java | 29 +++++++ .../admin/web/AdminAdminController.java | 24 ------ .../admin/web/AdminAuthController.java | 81 +++++++++++++------ .../admin/web/AdminIndexController.java | 42 ++++++++++ litemall-admin/src/api/login.js | 6 +- litemall-core/pom.xml | 5 ++ .../core/config/GlobalExceptionHandler.java | 9 +++ .../litemall/core/util/ResponseUtil.java | 4 + pom.xml | 6 ++ 15 files changed, 310 insertions(+), 161 deletions(-) create mode 100644 litemall-admin-api/src/main/java/org/linlinjava/litemall/admin/config/ShiroConfig.java delete mode 100644 litemall-admin-api/src/main/java/org/linlinjava/litemall/admin/dao/AdminToken.java delete mode 100644 litemall-admin-api/src/main/java/org/linlinjava/litemall/admin/service/AdminTokenManager.java create mode 100644 litemall-admin-api/src/main/java/org/linlinjava/litemall/admin/shiro/ShiroAdminRealm.java create mode 100644 litemall-admin-api/src/main/java/org/linlinjava/litemall/admin/shiro/ShiroWebSessionManager.java diff --git a/litemall-admin-api/pom.xml b/litemall-admin-api/pom.xml index 28da2b7f..636564f8 100644 --- a/litemall-admin-api/pom.xml +++ b/litemall-admin-api/pom.xml @@ -26,6 +26,11 @@ com.github.binarywang weixin-java-miniapp + + + org.apache.shiro + shiro-spring-boot-web-starter + diff --git a/litemall-admin-api/src/main/java/org/linlinjava/litemall/admin/annotation/support/LoginAdminHandlerMethodArgumentResolver.java b/litemall-admin-api/src/main/java/org/linlinjava/litemall/admin/annotation/support/LoginAdminHandlerMethodArgumentResolver.java index 2a3c0081..6b65ec86 100644 --- a/litemall-admin-api/src/main/java/org/linlinjava/litemall/admin/annotation/support/LoginAdminHandlerMethodArgumentResolver.java +++ b/litemall-admin-api/src/main/java/org/linlinjava/litemall/admin/annotation/support/LoginAdminHandlerMethodArgumentResolver.java @@ -1,7 +1,9 @@ package org.linlinjava.litemall.admin.annotation.support; +import org.apache.shiro.SecurityUtils; +import org.apache.shiro.subject.Subject; import org.linlinjava.litemall.admin.annotation.LoginAdmin; -import org.linlinjava.litemall.admin.service.AdminTokenManager; +import org.linlinjava.litemall.db.domain.LitemallAdmin; import org.springframework.core.MethodParameter; import org.springframework.web.bind.support.WebDataBinderFactory; import org.springframework.web.context.request.NativeWebRequest; @@ -10,7 +12,6 @@ import org.springframework.web.method.support.ModelAndViewContainer; public class LoginAdminHandlerMethodArgumentResolver implements HandlerMethodArgumentResolver { - public static final String LOGIN_TOKEN_KEY = "X-Litemall-Admin-Token"; @Override public boolean supportsParameter(MethodParameter parameter) { @@ -20,13 +21,9 @@ public class LoginAdminHandlerMethodArgumentResolver implements HandlerMethodArg @Override public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer container, NativeWebRequest request, WebDataBinderFactory factory) throws Exception { + Subject currentUser = SecurityUtils.getSubject(); + LitemallAdmin admin = (LitemallAdmin) currentUser.getPrincipal(); -// return new Integer(1); - String token = request.getHeader(LOGIN_TOKEN_KEY); - if (token == null || token.isEmpty()) { - return null; - } - - return AdminTokenManager.getUserId(token); + return admin.getId(); } } diff --git a/litemall-admin-api/src/main/java/org/linlinjava/litemall/admin/config/ShiroConfig.java b/litemall-admin-api/src/main/java/org/linlinjava/litemall/admin/config/ShiroConfig.java new file mode 100644 index 00000000..403afa22 --- /dev/null +++ b/litemall-admin-api/src/main/java/org/linlinjava/litemall/admin/config/ShiroConfig.java @@ -0,0 +1,76 @@ +package org.linlinjava.litemall.admin.config; + +import org.apache.shiro.realm.Realm; +import org.apache.shiro.session.mgt.SessionManager; +import org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor; +import org.apache.shiro.spring.web.ShiroFilterFactoryBean; +import org.apache.shiro.spring.web.config.DefaultShiroFilterChainDefinition; +import org.apache.shiro.spring.web.config.ShiroFilterChainDefinition; +import org.apache.shiro.mgt.SecurityManager; +import org.apache.shiro.web.mgt.DefaultWebSecurityManager; +import org.linlinjava.litemall.admin.shiro.ShiroAdminRealm; +import org.linlinjava.litemall.admin.shiro.ShiroWebSessionManager; +import org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.DependsOn; + +import java.util.LinkedHashMap; +import java.util.Map; + +@Configuration +public class ShiroConfig { + + @Bean + public Realm realm() { + return new ShiroAdminRealm(); + } + +// @Bean +// public ShiroFilterChainDefinition shiroFilterChainDefinition() { +// DefaultShiroFilterChainDefinition chain = new DefaultShiroFilterChainDefinition(); +// chain.addPathDefinition("/admin/login/login", "anon"); +// chain.addPathDefinition("/admin/login/unauth", "anon"); +// chain.addPathDefinition("/admin/**", "authc"); +// return chain; +// } + + @Bean + public ShiroFilterFactoryBean shirFilter(SecurityManager securityManager) { + ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean(); + shiroFilterFactoryBean.setSecurityManager(securityManager); + Map filterChainDefinitionMap = new LinkedHashMap(); + filterChainDefinitionMap.put("/admin/auth/login", "anon"); + filterChainDefinitionMap.put("/admin/auth/401", "anon"); + filterChainDefinitionMap.put("/admin/auth/index", "anon"); + filterChainDefinitionMap.put("/admin/auth/403", "anon"); + + filterChainDefinitionMap.put("/admin/**", "authc"); + shiroFilterFactoryBean.setLoginUrl("/admin/auth/401"); + shiroFilterFactoryBean.setSuccessUrl("/admin/auth/index"); + shiroFilterFactoryBean.setUnauthorizedUrl("/admin/auth/403"); + shiroFilterFactoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap); + return shiroFilterFactoryBean; + } + + @Bean + public SessionManager sessionManager() { + ShiroWebSessionManager mySessionManager = new ShiroWebSessionManager(); + return mySessionManager; + } + + @Bean + public DefaultWebSecurityManager securityManager() { + DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager(); + securityManager.setRealm(realm()); + securityManager.setSessionManager(sessionManager()); + return securityManager; + } + + @Bean + public AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor(SecurityManager securityManager) { + AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor = new AuthorizationAttributeSourceAdvisor(); + authorizationAttributeSourceAdvisor.setSecurityManager(securityManager); + return authorizationAttributeSourceAdvisor; + } +} diff --git a/litemall-admin-api/src/main/java/org/linlinjava/litemall/admin/dao/AdminToken.java b/litemall-admin-api/src/main/java/org/linlinjava/litemall/admin/dao/AdminToken.java deleted file mode 100644 index 0a1bc0d3..00000000 --- a/litemall-admin-api/src/main/java/org/linlinjava/litemall/admin/dao/AdminToken.java +++ /dev/null @@ -1,42 +0,0 @@ -package org.linlinjava.litemall.admin.dao; - -import java.time.LocalDateTime; - -public class AdminToken { - private Integer userId; - private String token; - private LocalDateTime expireTime; - private LocalDateTime updateTime; - - public Integer getUserId() { - return userId; - } - - public void setUserId(Integer userId) { - this.userId = userId; - } - - public String getToken() { - return token; - } - - public void setToken(String token) { - this.token = token; - } - - public LocalDateTime getExpireTime() { - return expireTime; - } - - public void setExpireTime(LocalDateTime expireTime) { - this.expireTime = expireTime; - } - - public LocalDateTime getUpdateTime() { - return updateTime; - } - - public void setUpdateTime(LocalDateTime updateTime) { - this.updateTime = updateTime; - } -} diff --git a/litemall-admin-api/src/main/java/org/linlinjava/litemall/admin/service/AdminTokenManager.java b/litemall-admin-api/src/main/java/org/linlinjava/litemall/admin/service/AdminTokenManager.java deleted file mode 100644 index c430a87b..00000000 --- a/litemall-admin-api/src/main/java/org/linlinjava/litemall/admin/service/AdminTokenManager.java +++ /dev/null @@ -1,58 +0,0 @@ -package org.linlinjava.litemall.admin.service; - -import org.linlinjava.litemall.admin.dao.AdminToken; -import org.linlinjava.litemall.core.util.CharUtil; - -import java.time.LocalDateTime; -import java.util.HashMap; -import java.util.Map; - -public class AdminTokenManager { - private static Map tokenMap = new HashMap<>(); - private static Map idMap = new HashMap<>(); - - public static Integer getUserId(String token) { - - AdminToken userToken = tokenMap.get(token); - if (userToken == null) { - return null; - } - - if (userToken.getExpireTime().isBefore(LocalDateTime.now())) { - tokenMap.remove(token); - idMap.remove(userToken.getUserId()); - return null; - } - - return userToken.getUserId(); - } - - - public static AdminToken generateToken(Integer id) { - AdminToken userToken = null; - -// userToken = idMap.get(id); -// if(userToken != null) { -// tokenMap.remove(userToken.getToken()); -// idMap.remove(id); -// } - - String token = CharUtil.getRandomString(32); - while (tokenMap.containsKey(token)) { - token = CharUtil.getRandomString(32); - } - - LocalDateTime update = LocalDateTime.now(); - LocalDateTime expire = update.plusDays(1); - - userToken = new AdminToken(); - userToken.setToken(token); - userToken.setUpdateTime(update); - userToken.setExpireTime(expire); - userToken.setUserId(id); - tokenMap.put(token, userToken); - idMap.put(id, userToken); - - return userToken; - } -} diff --git a/litemall-admin-api/src/main/java/org/linlinjava/litemall/admin/shiro/ShiroAdminRealm.java b/litemall-admin-api/src/main/java/org/linlinjava/litemall/admin/shiro/ShiroAdminRealm.java new file mode 100644 index 00000000..0f4ab529 --- /dev/null +++ b/litemall-admin-api/src/main/java/org/linlinjava/litemall/admin/shiro/ShiroAdminRealm.java @@ -0,0 +1,69 @@ +package org.linlinjava.litemall.admin.shiro; + + +import org.apache.shiro.authc.*; +import org.apache.shiro.authz.AuthorizationException; +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.linlinjava.litemall.core.util.bcrypt.BCryptPasswordEncoder; +import org.linlinjava.litemall.db.domain.LitemallAdmin; +import org.linlinjava.litemall.db.service.LitemallAdminService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.util.Assert; +import org.springframework.util.StringUtils; + +import java.util.List; + +public class ShiroAdminRealm extends AuthorizingRealm { + + private static final Logger log = LoggerFactory.getLogger(ShiroAdminRealm.class); + @Autowired + private LitemallAdminService adminService; + + @Override + protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) { + if (principals == null) { + throw new AuthorizationException("PrincipalCollection method argument cannot be null."); + } + + SimpleAuthorizationInfo info = new SimpleAuthorizationInfo(); + info.addRole("admin"); + info.addStringPermission("user"); + return info; + } + + @Override + protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException { + + UsernamePasswordToken upToken = (UsernamePasswordToken) token; + String username = upToken.getUsername(); + String password=new String(upToken.getPassword()); + + if (StringUtils.isEmpty(username)) { + throw new AccountException("用户名不能为空"); + } + if (StringUtils.isEmpty(password)) { + throw new AccountException("密码不能为空"); + } + + List adminList = adminService.findAdmin(username); + Assert.state(adminList.size() < 2, "同一个用户名存在两个账户"); + if (adminList.size() == 0) { + throw new UnknownAccountException("找不到用户("+username+")的帐号信息"); + } + LitemallAdmin admin = adminList.get(0); + + BCryptPasswordEncoder encoder = new BCryptPasswordEncoder(); + if (!encoder.matches(password, admin.getPassword())) { + throw new UnknownAccountException("找不到用户("+username+")的帐号信息"); + } + + + return new SimpleAuthenticationInfo(admin,password,getName()); + } + +} diff --git a/litemall-admin-api/src/main/java/org/linlinjava/litemall/admin/shiro/ShiroWebSessionManager.java b/litemall-admin-api/src/main/java/org/linlinjava/litemall/admin/shiro/ShiroWebSessionManager.java new file mode 100644 index 00000000..e33e0c55 --- /dev/null +++ b/litemall-admin-api/src/main/java/org/linlinjava/litemall/admin/shiro/ShiroWebSessionManager.java @@ -0,0 +1,29 @@ +package org.linlinjava.litemall.admin.shiro; + +import com.alibaba.druid.util.StringUtils; +import org.apache.shiro.web.servlet.ShiroHttpServletRequest; +import org.apache.shiro.web.session.mgt.DefaultWebSessionManager; +import org.apache.shiro.web.util.WebUtils; + +import javax.servlet.ServletRequest; +import javax.servlet.ServletResponse; +import java.io.Serializable; + +public class ShiroWebSessionManager extends DefaultWebSessionManager { + + public static final String LOGIN_TOKEN_KEY = "X-Litemall-Admin-Token"; + private static final String REFERENCED_SESSION_ID_SOURCE = "Stateless request"; + + @Override + protected Serializable getSessionId(ServletRequest request, ServletResponse response) { + String id = WebUtils.toHttp(request).getHeader(LOGIN_TOKEN_KEY); + if (!StringUtils.isEmpty(id)) { + request.setAttribute(ShiroHttpServletRequest.REFERENCED_SESSION_ID_SOURCE, REFERENCED_SESSION_ID_SOURCE); + request.setAttribute(ShiroHttpServletRequest.REFERENCED_SESSION_ID, id); + request.setAttribute(ShiroHttpServletRequest.REFERENCED_SESSION_ID_IS_VALID, Boolean.TRUE); + return id; + } else { + return super.getSessionId(request, response); + } + } +} diff --git a/litemall-admin-api/src/main/java/org/linlinjava/litemall/admin/web/AdminAdminController.java b/litemall-admin-api/src/main/java/org/linlinjava/litemall/admin/web/AdminAdminController.java index 5bc39c3b..02fee61f 100644 --- a/litemall-admin-api/src/main/java/org/linlinjava/litemall/admin/web/AdminAdminController.java +++ b/litemall-admin-api/src/main/java/org/linlinjava/litemall/admin/web/AdminAdminController.java @@ -3,7 +3,6 @@ package org.linlinjava.litemall.admin.web; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.linlinjava.litemall.admin.annotation.LoginAdmin; -import org.linlinjava.litemall.admin.service.AdminTokenManager; import org.linlinjava.litemall.core.util.RegexUtil; import org.linlinjava.litemall.core.util.ResponseUtil; import org.linlinjava.litemall.core.util.bcrypt.BCryptPasswordEncoder; @@ -33,29 +32,6 @@ public class AdminAdminController { @Autowired private LitemallAdminService adminService; - @GetMapping("/info") - public Object info(String token) { - Integer adminId = AdminTokenManager.getUserId(token); - if (adminId == null) { - return ResponseUtil.badArgumentValue(); - } - LitemallAdmin admin = adminService.findById(adminId); - if (admin == null) { - return ResponseUtil.badArgumentValue(); - } - - Map data = new HashMap<>(); - data.put("name", admin.getUsername()); - data.put("avatar", admin.getAvatar()); - - // 目前roles不支持,这里简单设置admin - List roles = new ArrayList<>(); - roles.add("admin"); - data.put("roles", roles); - data.put("introduction", "admin introduction"); - return ResponseUtil.ok(data); - } - @GetMapping("/list") public Object list(@LoginAdmin Integer adminId, String username, diff --git a/litemall-admin-api/src/main/java/org/linlinjava/litemall/admin/web/AdminAuthController.java b/litemall-admin-api/src/main/java/org/linlinjava/litemall/admin/web/AdminAuthController.java index b86a4d04..c60b6a62 100644 --- a/litemall-admin-api/src/main/java/org/linlinjava/litemall/admin/web/AdminAuthController.java +++ b/litemall-admin-api/src/main/java/org/linlinjava/litemall/admin/web/AdminAuthController.java @@ -2,29 +2,28 @@ package org.linlinjava.litemall.admin.web; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import org.apache.shiro.SecurityUtils; +import org.apache.shiro.authc.*; +import org.apache.shiro.subject.Subject; import org.linlinjava.litemall.admin.annotation.LoginAdmin; -import org.linlinjava.litemall.admin.dao.AdminToken; -import org.linlinjava.litemall.admin.service.AdminTokenManager; import org.linlinjava.litemall.core.util.JacksonUtil; import org.linlinjava.litemall.core.util.ResponseUtil; -import org.linlinjava.litemall.core.util.bcrypt.BCryptPasswordEncoder; import org.linlinjava.litemall.db.domain.LitemallAdmin; import org.linlinjava.litemall.db.service.LitemallAdminService; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.util.Assert; import org.springframework.util.StringUtils; import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; +import java.util.ArrayList; +import java.util.HashMap; import java.util.List; +import java.util.Map; import static org.linlinjava.litemall.admin.util.AdminResponseCode.ADMIN_INVALID_ACCOUNT; @RestController -@RequestMapping("/admin/login") +@RequestMapping("/admin/auth") @Validated public class AdminAuthController { private final Log logger = LogFactory.getLog(AdminAuthController.class); @@ -44,23 +43,18 @@ public class AdminAuthController { return ResponseUtil.badArgument(); } - List adminList = adminService.findAdmin(username); - Assert.state(adminList.size() < 2, "同一个用户名存在两个账户"); - if (adminList.size() == 0) { - return ResponseUtil.badArgumentValue(); + Subject currentUser = SecurityUtils.getSubject(); + try { + currentUser.login(new UsernamePasswordToken(username, password)); + } catch (UnknownAccountException uae) { + return ResponseUtil.fail(ADMIN_INVALID_ACCOUNT, "用户帐号或密码不正确"); + } catch (LockedAccountException lae) { + return ResponseUtil.fail(ADMIN_INVALID_ACCOUNT, "用户帐号已锁定不可用"); + + } catch (AuthenticationException ae) { + return ResponseUtil.fail(ADMIN_INVALID_ACCOUNT, ae.getMessage()); } - LitemallAdmin admin = adminList.get(0); - - BCryptPasswordEncoder encoder = new BCryptPasswordEncoder(); - if (!encoder.matches(password, admin.getPassword())) { - return ResponseUtil.fail(ADMIN_INVALID_ACCOUNT, "账号密码不对"); - } - - Integer adminId = admin.getId(); - // token - AdminToken adminToken = AdminTokenManager.generateToken(adminId); - - return ResponseUtil.ok(adminToken.getToken()); + return ResponseUtil.ok(currentUser.getSession().getId()); } /* @@ -72,6 +66,43 @@ public class AdminAuthController { return ResponseUtil.unlogin(); } + Subject currentUser = SecurityUtils.getSubject(); + currentUser.logout(); return ResponseUtil.ok(); } + + + @GetMapping("/info") + public Object info(@LoginAdmin Integer adminId) { + LitemallAdmin admin = adminService.findById(adminId); + if (admin == null) { + return ResponseUtil.badArgumentValue(); + } + + Map data = new HashMap<>(); + data.put("name", admin.getUsername()); + data.put("avatar", admin.getAvatar()); + + // 目前roles不支持,这里简单设置admin + List roles = new ArrayList<>(); + roles.add("admin"); + data.put("roles", roles); + data.put("introduction", "admin introduction"); + return ResponseUtil.ok(data); + } + + @GetMapping("/401") + public Object page401() { + return ResponseUtil.unlogin(); + } + + @GetMapping("/index") + public Object pageIndex() { + return ResponseUtil.ok(); + } + + @GetMapping("/403") + public Object page403() { + return ResponseUtil.unauthz(); + } } diff --git a/litemall-admin-api/src/main/java/org/linlinjava/litemall/admin/web/AdminIndexController.java b/litemall-admin-api/src/main/java/org/linlinjava/litemall/admin/web/AdminIndexController.java index a9b8e9cb..bbaed1e4 100644 --- a/litemall-admin-api/src/main/java/org/linlinjava/litemall/admin/web/AdminIndexController.java +++ b/litemall-admin-api/src/main/java/org/linlinjava/litemall/admin/web/AdminIndexController.java @@ -2,6 +2,7 @@ package org.linlinjava.litemall.admin.web; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import org.apache.shiro.authz.annotation.*; import org.linlinjava.litemall.core.util.ResponseUtil; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @@ -16,5 +17,46 @@ public class AdminIndexController { return ResponseUtil.ok("hello world, this is admin service"); } + @RequiresGuest + @RequestMapping("/guest") + public Object guest() { + return ResponseUtil.ok("hello world, this is admin service"); + } + + @RequiresAuthentication + @RequestMapping("/authn") + public Object authn() { + return ResponseUtil.ok("hello world, this is admin service"); + } + + @RequiresUser + @RequestMapping("/user") + public Object user() { + return ResponseUtil.ok("hello world, this is admin service"); + } + + @RequiresRoles("admin") + @RequestMapping("/admin") + public Object admin() { + return ResponseUtil.ok("hello world, this is admin service"); + } + + @RequiresRoles("admin2") + @RequestMapping("/admin2") + public Object admin2() { + return ResponseUtil.ok("hello world, this is admin service"); + } + + @RequiresPermissions("index:permission:read") + @RequestMapping("/read") + public Object read() { + return ResponseUtil.ok("hello world, this is admin service"); + } + + @RequiresPermissions("index:permission:write") + @RequestMapping("/write") + public Object write() { + return ResponseUtil.ok("hello world, this is admin service"); + } } diff --git a/litemall-admin/src/api/login.js b/litemall-admin/src/api/login.js index a2f79f06..2d2261ad 100644 --- a/litemall-admin/src/api/login.js +++ b/litemall-admin/src/api/login.js @@ -6,7 +6,7 @@ export function loginByUsername(username, password) { password } return request({ - url: '/login/login', + url: '/auth/login', method: 'post', data }) @@ -14,14 +14,14 @@ export function loginByUsername(username, password) { export function logout() { return request({ - url: '/login/logout', + url: '/auth/logout', method: 'post' }) } export function getUserInfo(token) { return request({ - url: '/admin/info', + url: '/auth/info', method: 'get', params: { token } }) diff --git a/litemall-core/pom.xml b/litemall-core/pom.xml index 9efeb1a4..43cbc8c1 100644 --- a/litemall-core/pom.xml +++ b/litemall-core/pom.xml @@ -43,6 +43,11 @@ + + org.apache.shiro + shiro-spring-boot-web-starter + + com.aliyun.oss aliyun-sdk-oss diff --git a/litemall-core/src/main/java/org/linlinjava/litemall/core/config/GlobalExceptionHandler.java b/litemall-core/src/main/java/org/linlinjava/litemall/core/config/GlobalExceptionHandler.java index e14e6227..8cd38387 100644 --- a/litemall-core/src/main/java/org/linlinjava/litemall/core/config/GlobalExceptionHandler.java +++ b/litemall-core/src/main/java/org/linlinjava/litemall/core/config/GlobalExceptionHandler.java @@ -1,5 +1,7 @@ package org.linlinjava.litemall.core.config; +import org.apache.shiro.authz.AuthorizationException; +import org.apache.shiro.authz.UnauthorizedException; import org.hibernate.validator.internal.engine.path.PathImpl; import org.linlinjava.litemall.core.util.ResponseUtil; import org.springframework.http.converter.HttpMessageNotReadableException; @@ -45,6 +47,13 @@ public class GlobalExceptionHandler { return ResponseUtil.badArgumentValue(); } + @ExceptionHandler(AuthorizationException.class) + @ResponseBody + public Object unauthorizedHandler(AuthorizationException e) { + e.printStackTrace(); + return ResponseUtil.unauthz(); + } + @ExceptionHandler(ValidationException.class) @ResponseBody public Object badArgumentHandler(ValidationException e) { diff --git a/litemall-core/src/main/java/org/linlinjava/litemall/core/util/ResponseUtil.java b/litemall-core/src/main/java/org/linlinjava/litemall/core/util/ResponseUtil.java index 73333e9d..faad6599 100644 --- a/litemall-core/src/main/java/org/linlinjava/litemall/core/util/ResponseUtil.java +++ b/litemall-core/src/main/java/org/linlinjava/litemall/core/util/ResponseUtil.java @@ -101,5 +101,9 @@ public class ResponseUtil { public static Object updatedDataFailed() { return fail(505, "更新数据失败"); } + + public static Object unauthz() { + return fail(506, "无操作权限"); + } } diff --git a/pom.xml b/pom.xml index 00ea48fd..325c07cb 100644 --- a/pom.xml +++ b/pom.xml @@ -69,6 +69,12 @@ 1.2.5 + + org.apache.shiro + shiro-spring-boot-web-starter + 1.4.0 + + mysql