- 浏览: 599264 次
- 性别:
- 来自: 厦门
文章分类
- 全部博客 (669)
- oracle (36)
- java (98)
- spring (48)
- UML (2)
- hibernate (10)
- tomcat (7)
- 高性能 (11)
- mysql (25)
- sql (19)
- web (42)
- 数据库设计 (4)
- Nio (6)
- Netty (8)
- Excel (3)
- File (4)
- AOP (1)
- Jetty (1)
- Log4J (4)
- 链表 (1)
- Spring Junit4 (3)
- Autowired Resource (0)
- Jackson (1)
- Javascript (58)
- Spring Cache (2)
- Spring - CXF (2)
- Spring Inject (2)
- 汉字拼音 (3)
- 代理模式 (3)
- Spring事务 (4)
- ActiveMQ (6)
- XML (3)
- Cglib (2)
- Activiti (15)
- 附件问题 (1)
- javaMail (1)
- Thread (19)
- 算法 (6)
- 正则表达式 (3)
- 国际化 (2)
- Json (3)
- EJB (3)
- Struts2 (1)
- Maven (7)
- Mybatis (7)
- Redis (8)
- DWR (1)
- Lucene (2)
- Linux (73)
- 杂谈 (2)
- CSS (13)
- Linux服务篇 (3)
- Kettle (9)
- android (81)
- protocol (2)
- EasyUI (6)
- nginx (2)
- zookeeper (6)
- Hadoop (41)
- cache (7)
- shiro (3)
- HBase (12)
- Hive (8)
- Spark (15)
- Scala (16)
- YARN (3)
- Kafka (5)
- Sqoop (2)
- Pig (3)
- Vue (6)
- sprint boot (19)
- dubbo (2)
- mongodb (2)
最新评论
@RequestMapping(value = "/checkUser",method= RequestMethod.POST) public @ResponseBody CommResult<Object> checkUser(HttpServletRequest request, HttpServletResponse response, ModelMap model) throws Exception { CommResult<Object> cr = new CommResult<Object>(); try { //随机数 String strData = request.getParameter( "strData" ); //加密后的随机数 String strSignedData = request.getParameter( "strSignedData" ); //B64编码的公钥证书 String strCertData = request.getParameter( "strCertData" ); //验证随机数的有效性 String certNumber = SecAuthUtil.getCertSN(strCertData);//ca序列号 String certExpDate = SecAuthUtil.getCertExpDate(strCertData);//CA有效期 CommResult cr2 = baseInterface.verifyCaSignData( strData, strSignedData, strCertData ); if (!cr2.isSuccess()) { return cr2; } String commonCapName = baseInterface.getCertCommonOrgName( strCertData ); // 证书通用名 UcenterOrgUserVo userOrgVo = new UcenterOrgUserVo(); userOrgVo.setCaCompName( commonCapName ); userOrgVo.setStatus( DicDataEnum.dataStatusValid.getId() ); UcenterOrgUserVo ucenterOrgUserVo = null; List<UcenterOrgUserVo> userVoList = this.ucenterOrgUserService.queryForList( userOrgVo ); if (!userVoList.isEmpty()) { this.baseInterface.updateCaNumber( userVoList.get( 0 ).getId(),strCertData ); } Subject currentUser = SecurityUtils.getSubject(); if (currentUser.isAuthenticated()) { currentUser.logout(); } UcenterUserVo userVo = this.ucenterUserService.getById( userVoList.get( 0 ).getUserId()); return dologin(currentUser, userVo, false ); } catch (Exception e) { cr.setSuccess(false); cr.setResult(CommResultEnum.ERROR,"异常发生!"); cr.setMsg( "请检查CA是否已绑定!" ); log.error("异常发生!", e); return cr; } } private CommResult<Object> dologin(Subject currentUser,UcenterUserVo checkUser, boolean isCalogin) { CommResult<Object> cr = new CommResult<Object>(); CommResultEnum res = CommResultEnum.SUCCESS; UpmsToken token = new UpmsToken(checkUser.getAccount(), checkUser.getPassword(), isCalogin ? LoginType.USER_CA.getType() : LoginType.USER.getType()); try { TokenManager.login(token); } catch (LockedAccountException lae) { res = CommResultEnum.USER_ACCOUNT_IS_LOCKED; } catch (UnknownAccountException uae) { res = CommResultEnum.USER_INVALID_USERNAME_OR_PASS; } catch (IncorrectCredentialsException ice) { res = CommResultEnum.USER_INVALID_USERNAME_OR_PASS; } catch (AuthenticationException ae) { res = CommResultEnum.USER_INVALID_USERNAME_OR_PASS; } catch (Exception e) { res = CommResultEnum.ERROR; } cr.setResult( res ); return cr; }
public class UpmsToken extends UsernamePasswordToken { private String loginType; public UpmsToken(String username, String password, String loginType) { super(username, password); this.loginType = loginType; } public String getLoginType() { return this.loginType; } public void setLoginType(String loginType) { this.loginType = loginType; } }
realm关联数据库
public class CAUserRealm extends AuthorizingRealm { @Autowired public IUcenterRoleMenuService ucenterRoleMenuService; @Autowired public IUcenterUserService ucenterUserService; public CAUserRealm() { } protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) { if (!SecurityUtils.getSubject().isAuthenticated()) { this.doClearCache(principalCollection); SecurityUtils.getSubject().logout(); return null; } else { Collection realms = principalCollection.fromRealm(this.getName()); if (realms.size() == 0) { return null; } else { String userId = ShiroKit.getUser().getId(); if (StringUtils.isBlank(userId)) { return null; } else { SimpleAuthorizationInfo info = new SimpleAuthorizationInfo(); SecurityUcenterUserInfoVo securityUserInfoVo = this.ucenterRoleMenuService.querySecurityUserInfo(userId); info.addRoles(securityUserInfoVo.getRoleCodeList()); info.addStringPermissions(securityUserInfoVo.getPermissions()); return info; } } } } protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authToken) throws AuthenticationException { UpmsToken token = (UpmsToken)authToken; UcenterUserVo user = this.ucenterUserService.getUserByAccount(token.getUsername()); if (user == null) { throw new UnknownAccountException("账号密码错误"); } else if (DicDataEnum.userLocked.getIntId().toString().equals(user.getStatus())) { throw new LockedAccountException("账号被锁定"); } else if (DicDataEnum.userStop.getIntId().toString().equals(user.getStatus())) { throw new LockedAccountException("账号已停用"); } else { UpmsShiroUser shiroUser = new UpmsShiroUser(); shiroUser.setAccount(user.getAccount()); shiroUser.setId(user.getId()); shiroUser.setLoginType(token.getLoginType()); shiroUser.setOrgId(user.getOrgId()); shiroUser.setUserName(user.getUsername()); return new SimpleAuthenticationInfo(shiroUser, user.getPassword(), this.getName()); } } public void clearCachedAuthorizationInfo() { PrincipalCollection principalCollection = SecurityUtils.getSubject().getPrincipals(); SimplePrincipalCollection principals = new SimplePrincipalCollection(principalCollection, this.getName()); super.clearCachedAuthorizationInfo(principals); } public void clearCachedAuthorizationInfo(PrincipalCollection principalCollection) { SimplePrincipalCollection principals = new SimplePrincipalCollection(principalCollection, this.getName()); super.clearCachedAuthorizationInfo(principals); } public boolean isPermitted(PrincipalCollection principals, String permission) { return super.isPermitted(principals, permission); } public String getName() { return LoginType.USER.toString(); } }
shiro小工具
public class ShiroKit { private static final String NAMES_DELIMETER = ","; public static final String hashAlgorithmName = "MD5"; public static final int hashIterations = 1024; public ShiroKit() { } public static String md5(String credentials, String saltSource) { ByteSource salt = new Md5Hash(saltSource); return (new SimpleHash("MD5", credentials, salt, 1024)).toString(); } public static String md5(String credentials) { return (new SimpleHash("MD5", credentials)).toString(); } public static String getRandomSalt(int length) { return RandomUtil.generateRandomString(length); } public static Subject getSubject() { return SecurityUtils.getSubject(); } public static boolean isUser() { return getSubject() != null && getSubject().getPrincipal() != null; } public static boolean isGuest() { return !isUser(); } public static UpmsShiroUser getUser() { return isGuest() ? null : (UpmsShiroUser)getSubject().getPrincipals().getPrimaryPrincipal(); } public static Session getSession() { return getSubject().getSession(); } public static <T> T getSessionAttr(String key) { Session session = getSession(); return session != null ? session.getAttribute(key) : null; } public static void setSessionAttr(String key, Object value) { Session session = getSession(); session.setAttribute(key, value); } public static void removeSessionAttr(String key) { Session session = getSession(); if (session != null) { session.removeAttribute(key); } } public static boolean hasRole(String roleName) { return getSubject() != null && roleName != null && roleName.length() > 0 && getSubject().hasRole(roleName); } public static boolean lacksRole(String roleName) { return !hasRole(roleName); } public static boolean hasAnyRoles(String roleNames) { boolean hasAnyRole = false; Subject subject = getSubject(); if (subject != null && roleNames != null && roleNames.length() > 0) { String[] var3 = roleNames.split(","); int var4 = var3.length; for(int var5 = 0; var5 < var4; ++var5) { String role = var3[var5]; if (subject.hasRole(role.trim())) { hasAnyRole = true; break; } } } return hasAnyRole; } public static boolean hasAllRoles(String roleNames) { boolean hasAllRole = true; Subject subject = getSubject(); if (subject != null && roleNames != null && roleNames.length() > 0) { String[] var3 = roleNames.split(","); int var4 = var3.length; for(int var5 = 0; var5 < var4; ++var5) { String role = var3[var5]; if (!subject.hasRole(role.trim())) { hasAllRole = false; break; } } } return hasAllRole; } public static boolean hasPermission(String permission) { return getSubject() != null && permission != null && permission.length() > 0 && getSubject().isPermitted(permission); } public static boolean lacksPermission(String permission) { return !hasPermission(permission); } public static boolean isAuthenticated() { return getSubject() != null && getSubject().isAuthenticated(); } public static boolean notAuthenticated() { return !isAuthenticated(); } public static String principal() { if (getSubject() != null) { Object principal = getSubject().getPrincipal(); return principal.toString(); } else { return ""; } } public static boolean isAjax(ServletRequest request) { return "XMLHttpRequest".equalsIgnoreCase(((HttpServletRequest)request).getHeader("X-Requested-With")); } }
<bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager"> <property name="authenticator" ref="authenticator"/> <!-- 基于数据库登录校验的实现--> <property name="realms"> <list> <ref bean="ucenterUserRealm"/> <ref bean="caRealm"/> </list> </property> <!-- session 管理器 --> <property name="sessionManager" ref="sessionManager"/> <!-- 缓存管理器 --> <property name="cacheManager" ref="upmsShiroCacheManager"/> </bean> <!-- 配置使用自定义认证器,可以实现多Realm认证,并且可以指定特定Realm处理特定类型的验证 --> <bean id="authenticator" class="com.hisea.upms.security.shiro.pam.UpmsModularRealmAuthenticator"> <!-- 配置认证策略,只要有一个Realm认证成功即可,并且返回所有认证成功信息 --> <property name="authenticationStrategy"> <bean class="org.apache.shiro.authc.pam.AtLeastOneSuccessfulStrategy"></bean> </property> <!-- 基于数据库登录校验的实现--> <property name="realms"> <list> <ref bean="ucenterUserRealm"/> <ref bean="caRealm"/> </list> </property> </bean>
发表评论
文章已被作者锁定,不允许评论。
-
Spring BeanFactoryPostProcessor和BeanPostProcessor的区别
2018-11-14 15:40 706链接:https://blog.csdn.net/caihai ... -
spring BeanPostProcessor理解
2018-11-14 11:31 321链接:https://blog.csdn.net/ginkgo ... -
Spring 源码解析之Initializer
2018-11-14 11:27 456链接:https://blog.csdn.net/ktlife ... -
spring transaction同一个类不回滚解决方法
2018-10-11 10:59 7711.修改配置文件 <aop:aspectj-autopr ... -
Spring @Transaction学习
2018-10-08 10:36 2921.考虑有下面这么一个类 public class Foo ... -
spring mvc i18n国际化学习(spring:message)
2018-06-09 09:35 640spring.xml文件中配置: <!-- 存储区域 ... -
Spring Boot Oauth2.0授权服务器
2018-05-11 14:19 1652什么是OAuth? OAuth(Open Authoriza ... -
Spring Boot @Import注解(将指定类实例注入到IOC容器中)
2018-05-09 10:20 1597SpringBoot 的 @Import 用于将指定的类实例注 ... -
Spring Boot @Conditional注解
2018-05-09 10:15 1816Spring Boot的强大之处在于使用了Spring 4框架 ... -
Spring Boot自定义starter pom实例(/META-INFO/spring.factory文件)
2018-05-09 09:48 1138自定义starter pom 自己实现一个简单的例子,当某个类 ... -
Spring Boot自动配置原理(@Conditional @Import)
2018-04-26 14:45 1338Springboot的自动配置是SpringBoot的关键,主 ... -
Spring Boot优缺点总结
2018-04-16 10:25 1536优点: 1.去除了大量的xml配置文件 2.简化 ... -
SpringBoot JPA @Transaction 知识学习
2018-03-16 09:09 761一、事务相关概念 1、事务的特点 原子性:事务是一个原子操 ... -
Sprint @Query注解的用法(nativeQuery=true/false)(Spring Data JPA)
2018-03-15 16:33 38391. 一个使用@Query注解的简单例子 @Query(val ... -
Spring Boot JpaRepository知识学习(Spring Data JPA)
2018-03-14 11:17 18011.Spring Data所解决的问题 Spring Dat ... -
SpringCloud Hystrix知识学习(防止雪崩效应)
2018-03-13 14:57 929一、Hystrix说明 1.服务雪崩效应:是一种因服务提供者的 ... -
SpringCloud @LoadBalanced注解学习
2018-03-13 09:48 2221当时我们说开启负载均衡很简单,只需要在RestTemplate ... -
Spring Boot配置方式(java配置和注解配置)
2018-03-12 15:09 1109Java配置 从Spring 3.x开始,Spring提供了J ... -
java RestTemplate访问restful服务
2018-03-01 15:02 1621REST的基础知识 当谈论REST时,有一种常见的错误就是将其 ... -
SpringCloud | 第七篇: 高可用的服务注册中心
2018-02-26 14:31 484文章 第一篇: 服务的注册与发现(Eureka) 介绍了服务注 ...
相关推荐
- **身份验证**:Controller接收到请求后,调用Shiro的AuthenticationManager进行身份验证。Shiro会尝试从数据库中查找匹配的用户名和密码。 - **授权**:如果身份验证成功,Shiro将创建一个Subject(代表当前用户)...
5. **处理登录与登出**:Shiro提供`Subject`接口作为用户的安全代理,可以通过`Subject.login`方法进行登录尝试,Shiro会自动调用Realm进行认证。登录成功后,`Subject`会持有`PrincipalCollection`(代表用户的身份...
在SpringBoot项目中,Shiro可以用来处理用户的身份验证(登录验证)、授权(权限控制)以及会话管理。在这个Demo中,Shiro的主要作用可能是实现用户登录时的密码加密和验证,以及后续访问资源时的权限控制。 **密码...
在 Shiro 中,认证是指验证用户身份的过程,而授权则是指判断用户是否有执行某个操作的权限。Shiro 提供了丰富的 API 和配置选项,使得开发者可以灵活地实现这些功能。 首先,我们需要创建用户、角色和权限的数据...
- 创建登录和注销的Controller方法,调用Shiro的`Subject.login`和`Subject.logout`方法进行用户登录和退出。 7. **Session管理** - Shiro提供了一套完整的会话管理机制,可以在不依赖Servlet容器的情况下管理...
登录时,通过Shiro进行认证,成功后获取用户的角色和对应的权限。 4. **创建Controller**:在控制器层,处理前端的登录请求,以及展示菜单的API调用。登录后,根据Service返回的权限信息动态生成前端的菜单数据。 5....
本实例将详细解释如何将Shiro与SSM进行整合,实现用户权限验证的增删改查功能。 首先,我们需要理解SSM框架的基础。Spring是核心容器,负责管理对象(如Bean)的生命周期和依赖注入。SpringMVC作为Spring的Web MVC...
在本项目中,"Maven+SSM+Shiro框架整合完整实现"旨在提供一个完整的解决方案,包括用户登录、记住密码、验证码等常见功能,并且可以方便地导入MySQL数据库进行运行。 **Maven** 是一个项目管理和综合工具,它帮助...
Shiro 会通过 Realm 获取与 Token 相关的用户信息,并进行匹配验证。 4. **凭证匹配**:Shiro 使用 Realm 中的 `doGetAuthenticationInfo()` 方法获取用户的凭证信息,然后与 Token 中的凭证进行比较。这一步通常...
在用户管理中,Shiro可以处理用户的登录验证,确保只有合法用户才能访问系统。角色管理则涉及到分配给用户的一组权限,这些权限决定了用户可以访问哪些资源。权限管理是Shiro的核心功能之一,它允许开发者定义细粒度...
- **授权(Authorization)**: 认证成功后,Shiro 会根据用户角色和权限进行访问控制,决定用户是否能访问某个资源。 5. **Shiro 的会话管理** - Shiro 可以独立于Servlet容器进行会话管理,支持分布式会话,适用...
SSM(Spring、SpringMVC、MyBatis)与Apache Shiro是Java开发中常见的两个技术框架,它们常被结合用于构建企业的Web应用系统,尤其是涉及到用户登录认证和权限管理的部分。下面将详细介绍如何利用SSM和Shiro来实现一...
- **过滤器**:Shiro的Web部分主要通过Filter实现,如`authc`(认证过滤器)和`perms`(权限过滤器)等,它们会在用户请求资源时进行拦截。 通过学习和实践这个例子,你将能够熟练掌握Shiro的配置和使用,为你的...
本文将详细介绍如何整合Spring MVC与Shiro进行用户登录、注销以及权限验证的实例。 首先,Spring MVC是Spring框架的一部分,它提供了一种模型驱动的开发方式,使得开发者可以更方便地构建RESTful的Web服务。它的...
3. **Controller和Service**:代码可能包含`Controller`类,它们处理HTTP请求,并通过`Service`层与Shiro进行交互,执行认证和授权操作。 4. **Subject API**:Shiro的`Subject`接口是与当前用户交互的主要方式,它...
在这个"shiro-Demo01"项目中,我们将会探讨如何在Web应用中集成Spring与Shiro来实现用户的身份验证和权限控制。 首先,我们需要了解Shiro的基本概念: 1. 认证:验证用户身份的过程,通常涉及到用户名和密码的校验...
在配置文件中,我们需要将自定义的Realm注入到Shiro的安全管理器中,这样Shiro在处理用户请求时会使用我们的自定义Realm进行认证和授权。例如,在`shiro.ini`中: ```ini [main] myRealm = ...
- JSP 页面将这些信息传递给 Shiro 的 `Subject` 进行认证。 - Shiro 通过 `Realm` 查询数据库,验证用户名和密码是否匹配。 - 如果验证成功,Shiro 将创建一个已认证的 `Subject`,并设置会话状态。 - 用户被...
Subject代表当前操作的用户,SecurityManager是Shiro的核心,它管理Subject并协调整个Shiro框架的工作,而Realm则负责与应用的特定安全存储进行交互,例如数据库,以获取验证和授权信息。 1. **配置Shiro** 在...
5. 使用 Shiro API:在 Controller 或 Service 层,可以通过 Subject 进行认证和授权操作,如登录、检查权限等。 ```java Subject subject = SecurityUtils.getSubject(); // 登录 subject.login(token); // 检查...