您的位置:首页 > 其它

智能销售系统-登录&角色

2019-03-29 19:20 46 查看
版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/weixin_44850939/article/details/88900132

一、登录
1.准备登录页面,点击登录的js方法
<%–
Created by IntelliJ IDEA.
User: zhaoyi
Date: 2018/10/14
Time: 下午4:27
To change this template use File | Settings | File Templates.
–%>
<%@ page contentType=“text/html;charset=UTF-8” language=“java” %>

源码智销系统 <%@ include file="/WEB-INF/views/head.jsp"%>
用户名:
密 码:
登陆 重置
2.完成loginController功能 (1)两个login方法 一个用于get登录,一个post登录

(2)完成登录功能
2.3.完成登录功能
2.3.1.EmployeeService:提供根据名称查询用户功能
@Override
public Employee findByUsername(String username) {
return employeeRepository.findByUsername(username);
}

2.3.2.JpaRealm:数据库数据

public class JpaRealm extends AuthorizingRealm {

@Autowired
private IEmployeeService employeeService;

。。。

//AuthenticationInfo:认证; 身份验证; 证明
//登录的时候就会调用这个方法来做验证
@Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
//身份认证(用户名)
// 1.拿到用户名
UsernamePasswordToken usernamePasswordToken = (UsernamePasswordToken)token;
String username = usernamePasswordToken.getUsername();
// 2.根据用户名到数据库拿到用户
Employee loginUser = employeeService.findByUsername(username);
if(loginUser==null){
return null; //该用户名不存在
}
//从数据库中拿到密码
Object credentials = loginUser.getPassword();
//加盐的数据
ByteSource byteSource = ByteSource.Util.bytes("itsource");
return new SimpleAuthenticationInfo(loginUser,credentials,byteSource,getName());
}

}

2.3.3.JsonResult:返回数据封装
//封装对象,确定返回值
public class JsonResult {

//是否操作成功
private boolean success = true;
//相应的提示信息
private String msg;

public JsonResult(){}
public JsonResult(boolean success, String msg) {
this.success = success;
this.msg = msg;
}
。。。

}

2.3.4.LoginController:登录功能
@RequestMapping(value="/login",method = RequestMethod.POST)
@ResponseBody
public JsonResult login(String username, String password){
//1.拿到访问的主体(当前登录用户)
Subject subject = SecurityUtils.getSubject();
//2.判断这个用户是否已经登录(通过验证)
if(!subject.isAuthenticated()){
//3.如果没有验证,就要完成登录
UsernamePasswordToken token = new UsernamePasswordToken(username,password);
try{
//4.根据toke完成登录功能
subject.login(token);
}catch (UnknownAccountException e){
System.out.println(“用户名不存在!!”);
e.printStackTrace();
return new JsonResult(false,“账号或者密码出错!”);
}catch (IncorrectCredentialsException e){
System.out.println(“密码不存在!”);
e.printStackTrace();
return new JsonResult(false,“账号或者密码出错!”);
}catch (AuthenticationException e){
System.out.println(“登录出错!”);
e.printStackTrace();
return new JsonResult(false,“程序发生未知错误!”);
}

}
return new JsonResult();

}

2.3.5.login.jsp:登录功能
function submitForm() {
$("#loginForm").form(“submit”, {
url : “/login”,
success : function(data) {
data = $.parseJSON(data);
if (data.success) {
location.href = “/main”;
} else {
$.messager.alert(“温馨提示”, data.msg, “info”);
}
}
});
}
function resetForm() {
$("#loginForm").form(“clear”);
}

2.4.其它功能
2.4.1.回车登录(理解代码即可)
$(document.documentElement).on(“keyup”, function(event) {
https://console.debug(event.keyCode);
var keyCode = event.keyCode;
console.debug(keyCode);
if (keyCode === 13) { // 捕获回车
submitForm(); // 提交表单
}
});

2.4.2.登录过期问题
// 检查自己是否是顶级页面
if (top != window) {// 如果不是顶级
//把子页面的地址,赋值给顶级页面显示
window.top.location.href = window.location.href;
}
2.4.3.展示用户名与注销
main.jsp:在资源中可以找到标签配置

源码时代智销系统

欢迎[]登录,退出
    3.数据库密码设置 public class MD5Util { // String algorithmName, Object source, Object salt, int hashIterations //设置盐值 public static final String SALT = "itsource"; //设置遍历次数 public static final int HASHITERATIONS = 10; //传入一个字符串,返回一个md5编码的值 public static String createMd5Str(String str){ SimpleHash hash = new SimpleHash("MD5",str,SALT,HASHITERATIONS); return hash.toString(); } } 4.判断添加还是修改对密码进行加密 @Test public void testUpdatePwd() throws Exception{ List list = employeeService.findAll(); for (Employee employee : list) { employee.setPassword(MD5Util.createMd5Str(employee.getPassword())); employeeService.save(employee); //注:save是添加与修改 } } 权限: 1.把权限改为数据库的真实权限拦截 List perms = permissionService.findAll(); //遍历,把每个值放进去 perms.forEach(p->{ filterChainDefinitionMap.put(p.getUrl(),"perms["+p.getSn()+"]");

    SimpleAuthenticationInfo authenticationInfo =
    new SimpleAuthenticationInfo(username,employee.getPassword(),salt,getName());
    username:不是传用户名的,因为用户名早就可以通过token来获取到了,不需要再传进去
    principal:主体(登录进去想把什么东西存起来,让shiro在任何地方都能拿到)

    异常:ClassCastException(类转换异常)

    //1.拿到当前用户
    Subject subject = SecurityUtils.getSubject();
    subject 中包含主体跟会话
    subject.getPrincipal();
    subject.getSession();(Shiro中的Session,不是http里面的)
    把主体放入Session中会更方便
    subject.getSession().setAttribute(“user_in_session”,subject.getPrincipal())
    以后有很多地方都需要用到当前登录用户

    每个登录用户有哪些权限应该从数据库中获取

    SELECT DISTINCT(去重) p.* FROM employee e JOIN employee_role er ON er.employee_id = e.id JOIN role r ON r.id = er.role_id JOIN role_permission rp ON rp.role_id = r.id

    删除没有权限的时候:
    普通请求会直接跳转页面
    Ajax请求会返回JSON
    怎么区分:Ajax有一个XMLHttpRequest(原生Ajax核心对象)

    自定义shiro权限拦截器
    shiro默认拦截器:PermissionAuthorizationFilter
    因为这个类的父类里面的isAc…方法里面没有判断Ajax请求,是直接跳转,所以需要重写这个方法

    只要有@ResponseBody(这个标签只能在Controller里面使用)就会自动帮我们转成JSON

    自己写了一个这个,shiro并不知道,所以在shiro.xml配置一个bean然后设置自定义权限拦截器

    内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
    标签: