`

shiro (四) spring结合 LoginService

 
阅读更多

 

package com.miv.shiro.login.service;

 

import java.util.Date;

import java.util.List;

 

import javax.mail.MessagingException;

import javax.mail.internet.MimeMessage;

 

import org.apache.shiro.SecurityUtils;

import org.apache.shiro.authc.LockedAccountException;

import org.apache.shiro.authc.UnknownAccountException;

import org.apache.shiro.subject.Subject;

import org.slf4j.Logger;

import org.slf4j.LoggerFactory;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.mail.javamail.MimeMessageHelper;

import org.springframework.stereotype.Service;

 

import com.miv.core.constant.DatabaseConstants;

import com.miv.core.json.JsonResponse;

import com.miv.core.utils.CommonUtils;

import com.miv.core.utils.DateUtils;

import com.miv.core.utils.FreeMarkerUtils;

import com.miv.core.utils.PropertiesUtil;

import com.miv.dao.PasswordDao;

import com.miv.dao.UsersDao;

import com.miv.entity.Passwords;

import com.miv.entity.User;

import com.miv.form.LoginView;

import com.miv.shiro.common.MIVshiroToken;

import com.miv.shiro.common.ShiroEncryption;

 

@Service

public class LoginService {

    final Logger logger = LoggerFactory.getLogger(LoginService.class);

    @Autowired

    private UsersDao userDao;

    @Autowired

    private PasswordDao passwordDao;

    @Autowired

    private org.springframework.mail.javamail.JavaMailSenderImpl mailSender;

 

    // 通过username和password登录

    public User findUserByUsernameAndPassword(User user) throws Exception {

 

        return userDao.findUserByUsernameAndPassword(user);

    }

 

    // 通过username查询属性

    public User findUserByUsername(User user) throws Exception {

 

        return userDao.findUserByUsername(user);

    }

 

    public User findAllByLoginName(String loginName) throws Exception {

        return userDao.getUnique(User.class, "loginName", loginName);

    }

 

    // 验证密码修改后登录

    public boolean checkPassword(String loginName) throws Exception {

        User user = new User();

        user.setLoginName(loginName);

        userDao.findUserByUsername(user);

        if (DatabaseConstants.PASSWORD_STATUS_1.intValue() == user.getPassswordStatus()) {

            return true;

        } else {

            return false;

        }

    }

 

    // 停用后自动登录

    public boolean checkDisableStatus(String loginName) {

        User user = new User();

        user.setLoginName(loginName);

        userDao.findUserByUsername(user);

        if (DatabaseConstants.STATUS_2.intValue() == user.getStatus()) {

            return true;

        } else {

            return false;

        }

    }

 

    public boolean updatePasswordStatus(User user) throws Exception {

        if (user.getPassswordStatus() == DatabaseConstants.PASSWORD_STATUS_1.intValue()) {

            user.setPassswordStatus(DatabaseConstants.PASSWORD_STATUS_0);

            userDao.update(user);

            return true;

        } else {

            return false;

        }

    }

 

    public JsonResponse findLogin(boolean rememberMe, LoginView user) throws Exception {

        JsonResponse jsonResponse = new JsonResponse();

        jsonResponse.setSuccess(true);

        Subject subject = SecurityUtils.getSubject();

        String password = CommonUtils.getMD5(user.getPassword());

        Integer ROLE_CODE = ShiroEncryption.decryption(user.get_cmd());

        MIVshiroToken token = new MIVshiroToken(user.getLoginName(), password, ROLE_CODE, false);

        token.setRememberMe(rememberMe);

        try {

            subject.login(token);

        } catch (UnknownAccountException uae) {

            logger.info(String.format("who %s , where %s , warn : %s", token.getUsername(), token.getHost(), uae));

            jsonResponse.setSuccess(false);

            jsonResponse.setData("用户名或密码错误,请重试。");

        } catch (LockedAccountException lae) {

            logger.warn(String.format("who %s , where %s , warn : %s", token.getUsername(), token.getHost(), lae));

            jsonResponse.setSuccess(false);

            jsonResponse.setData("帐号已被停用,请联系管理员!");

        } catch (Exception ee) {

            logger.info(String.format("who %s , where %s , warn : %s", token.getUsername(), token.getHost(), ee));

            jsonResponse.setSuccess(false);

            jsonResponse.setData("用户名或密码错误,请重试。");

        }

        if (jsonResponse.isSuccess()) {

            // 默认shiro使用request.getSession

            User user_ = this.findAllByLoginName(user.getLoginName());

            if (rememberMe) {// 修改密码后成功记住我登陆

                user_.setPassswordStatus(DatabaseConstants.PASSWORD_STATUS_0);

                this.updatePasswordStatus(user_);

            }

            subject.getSession(false).setAttribute("principals", user_);

            jsonResponse.setSuccess(true);

            jsonResponse.setData(ShiroEncryption.decryptionURL(ROLE_CODE, ShiroEncryption.SUCCESS));

        }

        return jsonResponse;

    }

 

    /**

     * 第一步:校验用户名与邮箱准确性; 第二步:更新所有以前的找回密码状态为失效 ;第三步:插入新的找回密码

     * 

     * @param loginName

     * @param email

     * @return

     * @throws Exception

     */

    public boolean insertApplyPassword(String loginName, String email) throws Exception {

        boolean flag = false;

        List<User> list = passwordDao.check(loginName, email);// 1

        if (list != null && list.size() > 0) {

            flag = true;

        } else {

            return false;

        }

        flag = passwordDao.updateApplyPassword(loginName, DatabaseConstants.PASSWORD_IS_VALID_0);// 2

        if (!flag) {

            return false;

        }

        Passwords password = new Passwords();// 3

        Date date = new Date();

        password.setCreatedTime(date);

        password.setEmail(email);

        password.setIndate(org.apache.commons.lang.time.DateUtils.addDays(date, 1));

        password.setIsValid(DatabaseConstants.PASSWORD_IS_VALID_1);

        password.setLoginName(loginName);

        password.setOldPassword(list.get(0).getPassword());

 

        Passwords passwords = (Passwords) passwordDao.save(password);

        passwords.setApplyKey(CommonUtils.getMD5(CommonUtils.getMD5(passwords.getId().toString())));

        passwordDao.update(passwords);

        flag = this.mailSender(loginName, email, passwords);

        return flag;

    }

 

    /**

     * @throws Exception

     * @throws MessagingException

     * 

     */

    public boolean mailSender(String loginName, String email, Passwords passwords) {

        // 生成HTML

        String sourceDir = FreeMarkerUtils.getSourceDir();

        String sourceName = "test.ftl";

        String targetDir = PropertiesUtil.getProperties("html_file_patch");

        String targetName = passwords.getApplyKey() + ".html";

        String data = PropertiesUtil.getProperties("http_miv") + passwords.getApplyKey();

        try {

            FreeMarkerUtils.generateHtml(sourceDir, sourceName, targetDir, targetName, data);

        } catch (Exception e1) {

            // TODO Auto-generated catch block

            e1.printStackTrace();

            return false;

        }

 

        try {

            MimeMessage mailMessage = mailSender.createMimeMessage();

            // 设置utf-8或GBK编码,否则邮件会有乱码

            MimeMessageHelper messageHelper = new MimeMessageHelper(mailMessage, true, "utf-8");

            // 设置收件人,寄件人

            messageHelper.setTo(email);

            messageHelper.setFrom(mailSender.getUsername());

            messageHelper.setSubject("测试HTML邮件!");

            // true 表示启动HTML格式的邮件

            messageHelper.setText(FreeMarkerUtils.getHtml(targetDir, targetName), true);

            // 发送邮件

            mailSender.send(mailMessage);

            return true;

        } catch (MessagingException e) {

            // TODO Auto-generated catch block

            e.printStackTrace();

            return false;

        }

    }

 

    /**

     * 查用户名

     * 

     * @param applyKey

     * @return

     */

    public boolean updateApplyPassword(String applyKey) {

        boolean flag = false;

        Date sender = new Date();

        Passwords passwords = passwordDao.getUnique(Passwords.class, "applyKey", applyKey);

        flag = passwords != null && DateUtils.greaterThan(passwords.getIndate(), sender)

                && (DatabaseConstants.PASSWORD_IS_VALID_1.intValue() == passwords.getIsValid());

        if (flag) {

            passwords.setIsValid(DatabaseConstants.PASSWORD_IS_VALID_2);

            passwords.setRetrieveTime(sender);

            passwordDao.update(passwords);

        }

        return flag;

    }

 

    /**

     * 校验applyKey,并更改密码

     * 

     * @param applyKey

     * @return

     */

    public boolean updateApplyPassword(String applyKey, String newPassword) {

        boolean flag = false;

        Date sender = new Date();

        Passwords passwords = passwordDao.getUnique(Passwords.class, "applyKey", applyKey);

        flag = passwords != null && DateUtils.greaterThan(passwords.getIndate(), sender)

                && (DatabaseConstants.PASSWORD_IS_VALID_2.intValue() == passwords.getIsValid());

        if (flag) {

            userDao.updatePassword(passwords.getLoginName(), CommonUtils.getMD5(newPassword));

 

            passwords.setNewPassword(newPassword);

            passwords.setIsValid(DatabaseConstants.PASSWORD_IS_VALID_0);

            passwords.setRetrieveTime(sender);

            passwordDao.update(passwords);

        }

        return flag;

    }

 

    public User findUserByApplyKey(String applyKey) {

        Passwords passwords = passwordDao.getUnique(Passwords.class, "applyKey", applyKey);

        User user = new User();

        user.setLoginName(passwords.getLoginName());

        user = userDao.findUserByUsername(user);

        return user;

    }

}


分享到:
评论

相关推荐

    shiro-spring-1.3.2-API文档-中英对照版.zip

    赠送jar包:shiro-spring-1.3.2.jar 赠送原API文档:shiro-spring-1.3.2-javadoc.jar 赠送源代码:shiro-spring-1.3.2-sources.jar 包含翻译后的API文档:shiro-spring-1.3.2-javadoc-API文档-中文(简体)-英语-...

    shiro-spring-1.3.2-API文档-中文版.zip

    赠送jar包:shiro-spring-1.3.2.jar; 赠送原API文档:shiro-spring-1.3.2-javadoc.jar; 赠送源代码:shiro-spring-1.3.2-sources.jar; 包含翻译后的API文档:shiro-spring-1.3.2-javadoc-API文档-中文(简体)版...

    shiro+spring的Demo

    在Java Web开发领域,Apache Shiro和Spring框架的结合使用已经成为一种常见的安全解决方案。本示例项目"shiro+Spring的Demo"旨在展示如何将这两个强大的工具集整合,以实现高效、灵活的身份认证和授权功能。项目基于...

    spring cloud + shiro集成方案

    手把手教你集成spring cloud + shiro微服务框架;用最少的工作量,改造基于shiro安全框架的微服务项目,实现spring cloud + shiro 框架集成。博客地址:...

    shiro-spring.jar

    shiro-spring1.4.0的jar包,晚上找了好久才找到的,现发出来

    shiro整合spring项目实例

    Shiro 可以无缝集成到Spring应用中,通过Spring的Bean配置,我们可以将Shiro的安全组件注入到Spring容器中。这包括SecurityManager、Realm、Filter等核心组件,从而利用Spring的依赖注入(DI)和面向切面编程(AOP...

    shiro-spring-1.4.0-API文档-中文版.zip

    赠送jar包:shiro-spring-1.4.0.jar; 赠送原API文档:shiro-spring-1.4.0-javadoc.jar; 赠送源代码:shiro-spring-1.4.0-sources.jar; 赠送Maven依赖信息文件:shiro-spring-1.4.0.pom; 包含翻译后的API文档:...

    shiro和spring整合

    Apache Shiro 和 Spring 的整合是Java Web开发中常见的安全框架集成方式,这使得开发者能够利用Shiro的强大安全功能,同时享受Spring的灵活架构优势。在本文中,我们将深入探讨Shiro与Spring整合的关键知识点,包括...

    shiro+spring+data+session+redis实现单点登录

    本案例聚焦于使用Apache Shiro、Spring、Spring Data以及Redis来实现单点登录功能,下面将详细解释这些组件以及它们如何协同工作。 **Apache Shiro** Apache Shiro是一款轻量级的安全框架,提供了认证、授权、会话...

    shiro-spring-1.2.3 jar包

    shiro-spring-1.2.3 jar包

    shiro与spring web 项目集成.pdf

    Shiro与Spring Web项目的整合,首先需要在Spring项目中整合Shiro。整合的过程可以分为以下两个关键步骤: #### 1.1 添加Shiro依赖的jar包 为了将Shiro引入Spring项目,需要在项目中添加Shiro的依赖jar包。在项目的...

    shiro整合spring+springmvcjar包

    在Java Web 开发中,Shiro 被广泛用于构建安全控制层,而Spring 和 Spring MVC 则是两个流行的Java企业级应用开发框架,分别负责依赖注入和Web MVC层面的处理。将Shiro 整合到Spring 和 Spring MVC 中,可以实现统一...

    shiro-spring-1.2.3-API文档-中文版.zip

    赠送jar包:shiro-spring-1.2.3.jar; 赠送原API文档:shiro-spring-1.2.3-javadoc.jar; 赠送源代码:shiro-spring-1.2.3-sources.jar; 赠送Maven依赖信息文件:shiro-spring-1.2.3.pom; 包含翻译后的API文档:...

    Shiro+Spring Security学习文档

    在IT安全领域,Apache Shiro和Spring Security是两个非常重要的框架,它们主要用于应用程序的安全管理,包括身份验证、授权、会话管理和加密等。本学习文档集合了这两个框架的相关知识,旨在帮助开发者深入理解和...

    cas+shiro+spring实例

    这个实例是专为初学者设计的,旨在帮助他们理解和实现基于CAS的单点登录(Single Sign-On, SSO)系统,同时结合Shiro进行权限管理和认证。下面我们将详细探讨这些技术以及它们如何协同工作。 **CAS (Central ...

    shiro-spring-1.2.3-API文档-中英对照版.zip

    赠送jar包:shiro-spring-1.2.3.jar; 赠送原API文档:shiro-spring-1.2.3-javadoc.jar; 赠送源代码:shiro-spring-1.2.3-sources.jar; 赠送Maven依赖信息文件:shiro-spring-1.2.3.pom; 包含翻译后的API文档:...

    shiro-spring-1.4.0-API文档-中英对照版.zip

    赠送jar包:shiro-spring-1.4.0.jar; 赠送原API文档:shiro-spring-1.4.0-javadoc.jar; 赠送源代码:shiro-spring-1.4.0-sources.jar; 赠送Maven依赖信息文件:shiro-spring-1.4.0.pom; 包含翻译后的API文档:...

    shiro-spring-boot-web-starter-1.4.0.jar

    java运行依赖jar包

    shiro和spring整合,使用权限注解

    总之,Shiro与Spring的结合提供了强大的安全控制能力,通过权限注解可以在不改变业务逻辑的情况下实现细粒度的访问控制,使得应用的安全性得到显著提升。同时,这种整合方式也提高了代码的可读性和维护性,是现代...

    shiro+spring集成

    以上就是关于 "shiro+spring 集成" 的主要知识点,通过这些内容,开发者可以理解如何在实际项目中结合 Shiro 和 Spring 来构建安全的 Java 应用。在实际操作中,还需要根据具体需求调整配置和实现细节。

Global site tag (gtag.js) - Google Analytics