`

shiro controller进行用户验证

 
阅读更多
 @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>
分享到:
评论
发表评论

文章已被作者锁定,不允许评论。

相关推荐

    Java SSM、 shiro开发用户登录权限认证的实例demo

    - **身份验证**:Controller接收到请求后,调用Shiro的AuthenticationManager进行身份验证。Shiro会尝试从数据库中查找匹配的用户名和密码。 - **授权**:如果身份验证成功,Shiro将创建一个Subject(代表当前用户)...

    shiro认证及授权demo

    5. **处理登录与登出**:Shiro提供`Subject`接口作为用户的安全代理,可以通过`Subject.login`方法进行登录尝试,Shiro会自动调用Realm进行认证。登录成功后,`Subject`会持有`PrincipalCollection`(代表用户的身份...

    SpringBoot + shiro Demo 简单登录验证权限验证

    在SpringBoot项目中,Shiro可以用来处理用户的身份验证(登录验证)、授权(权限控制)以及会话管理。在这个Demo中,Shiro的主要作用可能是实现用户登录时的密码加密和验证,以及后续访问资源时的权限控制。 **密码...

    Shiro中进行角色与权限认证流程示例代码.zip

    在 Shiro 中,认证是指验证用户身份的过程,而授权则是指判断用户是否有执行某个操作的权限。Shiro 提供了丰富的 API 和配置选项,使得开发者可以灵活地实现这些功能。 首先,我们需要创建用户、角色和权限的数据...

    shiro+spirngmvc 验证 IntelliJ IDEA

    - 创建登录和注销的Controller方法,调用Shiro的`Subject.login`和`Subject.logout`方法进行用户登录和退出。 7. **Session管理** - Shiro提供了一套完整的会话管理机制,可以在不依赖Servlet容器的情况下管理...

    spring boot+shiro+mybatis实现不同用户登录显示不同的权限菜单

    登录时,通过Shiro进行认证,成功后获取用户的角色和对应的权限。 4. **创建Controller**:在控制器层,处理前端的登录请求,以及展示菜单的API调用。登录后,根据Service返回的权限信息动态生成前端的菜单数据。 5....

    ssm整合shiro实现用户权限验证的增删改查实例demo.zip

    本实例将详细解释如何将Shiro与SSM进行整合,实现用户权限验证的增删改查功能。 首先,我们需要理解SSM框架的基础。Spring是核心容器,负责管理对象(如Bean)的生命周期和依赖注入。SpringMVC作为Spring的Web MVC...

    Maven+SSM+Shiro框架整合完整实现,实现某权限用户登录,记住密码,验证码等功能。

    在本项目中,"Maven+SSM+Shiro框架整合完整实现"旨在提供一个完整的解决方案,包括用户登录、记住密码、验证码等常见功能,并且可以方便地导入MySQL数据库进行运行。 **Maven** 是一个项目管理和综合工具,它帮助...

    Apache Shiro 身份认证例子-源码

    Shiro 会通过 Realm 获取与 Token 相关的用户信息,并进行匹配验证。 4. **凭证匹配**:Shiro 使用 Realm 中的 `doGetAuthenticationInfo()` 方法获取用户的凭证信息,然后与 Token 中的凭证进行比较。这一步通常...

    spring+shiro 增删改查权限控制

    在用户管理中,Shiro可以处理用户的登录验证,确保只有合法用户才能访问系统。角色管理则涉及到分配给用户的一组权限,这些权限决定了用户可以访问哪些资源。权限管理是Shiro的核心功能之一,它允许开发者定义细粒度...

    springMVC整合shiro框架

    - **授权(Authorization)**: 认证成功后,Shiro 会根据用户角色和权限进行访问控制,决定用户是否能访问某个资源。 5. **Shiro 的会话管理** - Shiro 可以独立于Servlet容器进行会话管理,支持分布式会话,适用...

    ssm+shiro实现简单的登陆认证功能

    SSM(Spring、SpringMVC、MyBatis)与Apache Shiro是Java开发中常见的两个技术框架,它们常被结合用于构建企业的Web应用系统,尤其是涉及到用户登录认证和权限管理的部分。下面将详细介绍如何利用SSM和Shiro来实现一...

    跟我学shiro

    - **过滤器**:Shiro的Web部分主要通过Filter实现,如`authc`(认证过滤器)和`perms`(权限过滤器)等,它们会在用户请求资源时进行拦截。 通过学习和实践这个例子,你将能够熟练掌握Shiro的配置和使用,为你的...

    spring mvc整合shiro登录 权限验证实例下载

    本文将详细介绍如何整合Spring MVC与Shiro进行用户登录、注销以及权限验证的实例。 首先,Spring MVC是Spring框架的一部分,它提供了一种模型驱动的开发方式,使得开发者可以更方便地构建RESTful的Web服务。它的...

    shiro框架的测试代码

    3. **Controller和Service**:代码可能包含`Controller`类,它们处理HTTP请求,并通过`Service`层与Shiro进行交互,执行认证和授权操作。 4. **Subject API**:Shiro的`Subject`接口是与当前用户交互的主要方式,它...

    shiro-Demo01

    在这个"shiro-Demo01"项目中,我们将会探讨如何在Web应用中集成Spring与Shiro来实现用户的身份验证和权限控制。 首先,我们需要了解Shiro的基本概念: 1. 认证:验证用户身份的过程,通常涉及到用户名和密码的校验...

    shiro-realm案例

    在配置文件中,我们需要将自定义的Realm注入到Shiro的安全管理器中,这样Shiro在处理用户请求时会使用我们的自定义Realm进行认证和授权。例如,在`shiro.ini`中: ```ini [main] myRealm = ...

    shirodemo实现web登陆

    - JSP 页面将这些信息传递给 Shiro 的 `Subject` 进行认证。 - Shiro 通过 `Realm` 查询数据库,验证用户名和密码是否匹配。 - 如果验证成功,Shiro 将创建一个已认证的 `Subject`,并设置会话状态。 - 用户被...

    shiro简单登录+logback日志记录

    Subject代表当前操作的用户,SecurityManager是Shiro的核心,它管理Subject并协调整个Shiro框架的工作,而Realm则负责与应用的特定安全存储进行交互,例如数据库,以获取验证和授权信息。 1. **配置Shiro** 在...

    shiro最简单整合版本

    5. 使用 Shiro API:在 Controller 或 Service 层,可以通过 Subject 进行认证和授权操作,如登录、检查权限等。 ```java Subject subject = SecurityUtils.getSubject(); // 登录 subject.login(token); // 检查...

Global site tag (gtag.js) - Google Analytics