Commit 4864387c authored by liboyang's avatar liboyang

1.springboot+shiro+thymeleaf+mybatis实现用户登录认证和管理员添加权限

parent 56c66479
package com.yxproject.start;
import com.yxproject.start.config.JerseyConfig;
//import com.yxproject.start.config.JerseyConfig;
import org.glassfish.jersey.servlet.ServletContainer;
import org.glassfish.jersey.servlet.ServletProperties;
import org.springframework.boot.SpringApplication;
......@@ -17,13 +17,13 @@ import org.springframework.context.annotation.Bean;
public class Main{
@Bean
public ServletRegistrationBean jerseyServlet() {
ServletRegistrationBean registration = new ServletRegistrationBean(new ServletContainer(), "/rest/*");
registration.addInitParameter(ServletProperties.JAXRS_APPLICATION_CLASS,
JerseyConfig.class.getName());
return registration;
}
// @Bean
// public ServletRegistrationBean jerseyServlet() {
// ServletRegistrationBean registration = new ServletRegistrationBean(new ServletContainer(), "/rest/*");
// registration.addInitParameter(ServletProperties.JAXRS_APPLICATION_CLASS,
// JerseyConfig.class.getName());
// return registration;
// }
public static void main(String[] args) {
SpringApplication.run(Main.class, args);
......
package com.yxproject.start.api;
import com.yxproject.start.entity.SysPermission;
import com.yxproject.start.entity.UserInfo;
import com.yxproject.start.service.SystemUserService;
import com.yxproject.start.service.SysPermissionService;
import com.yxproject.start.service.UserInfoService;
import com.yxproject.start.service.impl.UserInfoServiceImpl;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.IncorrectCredentialsException;
import org.apache.shiro.authc.UnknownAccountException;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.authz.Permission;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.apache.shiro.session.Session;
import org.apache.shiro.subject.Subject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import javax.ws.rs.*;
import javax.ws.rs.core.MediaType;
import java.awt.*;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map;
@Path("user")
@Controller
/**
* @author Administrator
*/
public class UserInfoApi {
@Autowired
private SystemUserService systemUserService;
private SysPermissionService sysPermissionService;
// @RequestMapping("login")
// @Produces(MediaType.APPLICATION_JSON)
// public Map<String, Object> submitLogin(@QueryParam("username") String username, @QueryParam("password") String password) {
// Map<String, Object> resultMap = new LinkedHashMap<String, Object>();
// Subject currentUser = SecurityUtils.getSubject();
//
// // 把用户名和密码封装为 UsernamePasswordToken 对象
// UsernamePasswordToken token = new UsernamePasswordToken(username, password);
// try {
// currentUser.login(token);
// resultMap.put("status", 200);
// resultMap.put("message", "登录成功");
// } catch (UnknownAccountException e) {
// resultMap.put("status", 500);
// resultMap.put("message", "账号不存在!");
// }catch(IncorrectCredentialsException e1){
// resultMap.put("status", 501);
// resultMap.put("message", "密码错误!");
// }catch (Exception e) {
// resultMap.put("status", 500);
// resultMap.put("message", "账号不存在");
// }
//
// return resultMap;
// }
@GET
@Path("userLogin")
@Produces(MediaType.APPLICATION_JSON)
public Map<String, Object> submitLogin(@QueryParam("username") String username, @QueryParam("password") String password) {
Map<String, Object> resultMap = new LinkedHashMap<String, Object>();
Subject currentUser = SecurityUtils.getSubject();
// 把用户名和密码封装为 UsernamePasswordToken 对象
UsernamePasswordToken token = new UsernamePasswordToken(username, password);
try {
currentUser.login(token);
resultMap.put("status", 200);
resultMap.put("message", "登录成功");
} catch (UnknownAccountException e) {
resultMap.put("status", 500);
resultMap.put("message", "账号不存在!");
}catch(IncorrectCredentialsException e1){
resultMap.put("status", 501);
resultMap.put("message", "密码错误!");
}catch (Exception e) {
resultMap.put("status", 500);
resultMap.put("message", "账号不存在");
}
@RequestMapping(value="/permissionAdd",method= RequestMethod.POST)
@RequiresPermissions("userInfo.add")
@ResponseBody
public String userAdd(@ModelAttribute SysPermission sysPermission) {
return resultMap;
// Map<String, Object> resultMap = new HashMap<String, Object>();
// String name = sysPermission.getName();
// String resourceType = sysPermission.getResourceType();
// String url = sysPermission.getUrl();
// String permission =sysPermission.getPermission();
// long parentId = sysPermission.getParentId();
// String parentIds = sysPermission.getParentIds();
// resultMap.put("id",4);
// resultMap.put("name",name);
// resultMap.put("resourceType",resourceType);
// resultMap.put("url",url);
// resultMap.put("permission",permission);
// resultMap.put("parentId",parentId);
// resultMap.put("parentIds",parentIds);
// resultMap.put("available",false);
// System.out.println(resultMap.toString());
System.out.println("?????");
sysPermissionService.addPermission(sysPermission);
return "yes";
}
@POST
@Path("userAdd")
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
@RequiresPermissions("user:add")
public Map<String, Object> userAdd(String json) {
Map<String, Object> resultMap = new LinkedHashMap<String, Object>();
// /**
// * 用户添加;
// * @return
// */
// @RequestMapping(value = "/userAdd",method = RequestMethod.POST)
// @RequiresPermissions("userInfo.add")//权限管理;
// public String userInfoAdd(@QueryParam("username") String username, @QueryParam("password") String password){
// System.out.println("username------"+username+" -----password-----"+password);
// UserInfoService systemUserService = new UserInfoServiceImpl();
// int i = systemUserService.addUsername(new UserInfo());
//// int i = 0;
// System.out.println(i+"------返回值");
// return i+"userInfoAdd";
// }
//
// /**
// * 用户删除;
// * @return
// */
// @RequestMapping(value = "/userDel",method = RequestMethod.POST)
// @RequiresPermissions("userInfo.del")//权限管理;
// public String userInfoDel(@QueryParam("username") String username, @QueryParam("password") String password){
// System.out.println("username------"+username+" -----password-----"+password);
// UserInfoService systemUserService = new UserInfoServiceImpl();
// int i = systemUserService.delUsername(new UserInfo());
//// int i = 0;
// System.out.println(i+"------返回值");
// return i+"userInfoAdd";
// }
//
// /**
// * 用户更新;
// * @return
// */
// @RequestMapping(value = "/userUpdate",method = RequestMethod.POST)
// @RequiresPermissions("userInfo.update")//权限管理;
// public String userInfoUpdate(@QueryParam("username") String username, @QueryParam("password") String password){
// System.out.println("username------"+username+" -----password-----"+password);
// UserInfoService systemUserService = new UserInfoServiceImpl();
// int i = systemUserService.updateUsername(new UserInfo());
//// int i = 0;
// System.out.println(i+"------返回值");
// return i+"userInfoAdd";
// }
return resultMap;
}
}
package com.yxproject.start.config;
import com.yxproject.start.api.UserInfoApi;
import org.glassfish.jersey.server.ResourceConfig;
public class JerseyConfig extends ResourceConfig {
public JerseyConfig() {
register(UserInfoApi.class);
}
}
//package com.yxproject.start.config;
//
//import com.yxproject.start.api.UserInfoApi;
//import org.glassfish.jersey.server.ResourceConfig;
//
//public class JerseyConfig extends ResourceConfig {
// public JerseyConfig() {
// register(UserInfoApi.class);
// }
//}
......@@ -3,7 +3,7 @@ package com.yxproject.start.config;
import com.yxproject.start.entity.SysPermission;
import com.yxproject.start.entity.SysRole;
import com.yxproject.start.entity.UserInfo;
import com.yxproject.start.service.SystemUserService;
import com.yxproject.start.service.UserInfoService;
import org.apache.shiro.authc.AuthenticationException;
import org.apache.shiro.authc.AuthenticationInfo;
import org.apache.shiro.authc.AuthenticationToken;
......@@ -21,7 +21,7 @@ import org.springframework.beans.factory.annotation.Autowired;
public class MyShiroRealm extends AuthorizingRealm {
@Autowired
private SystemUserService systemUserService;
private UserInfoService userInfoService;
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
System.out.println(principals.getPrimaryPrincipal());
......@@ -53,7 +53,7 @@ public class MyShiroRealm extends AuthorizingRealm {
System.out.println(token.getCredentials().toString());
//通过username从数据库中查找 User对象,如果找到,没找到.
//实际项目中,这里可以根据实际情况做缓存,如果不做,Shiro自己也是有时间间隔机制,2分钟内不会重复执行该方法
UserInfo user = systemUserService.findByUsername(username);
UserInfo user = userInfoService.findByUsername(username);
if(user == null){
return null;
}
......
......@@ -31,13 +31,14 @@ public class ShiroConfig {
//配置退出 过滤器,其中的具体的退出代码Shiro已经替我们实现了
filterChainDefinitionMap.put("/logout", "logout");
//<!-- 过滤链定义,从上向下顺序执行,一般将/**放在最为下边 -->:这是一个坑呢,一不小心代码就不好使了;
filterChainDefinitionMap.put("/**", "authc");
// 如果不设置默认会自动寻找Web工程根目录下的"/login.jsp"页面
shiroFilterFactoryBean.setLoginUrl("/userLogin");
// 登录成功后要跳转的链接
shiroFilterFactoryBean.setSuccessUrl("/index");
//<!-- authc:所有url都必须认证通过才可以访问; anon:所有url都都可以匿名访问-->
filterChainDefinitionMap.put("/**", "authc");
//未授权界面;
shiroFilterFactoryBean.setUnauthorizedUrl("/403");
......
......@@ -8,14 +8,21 @@ import java.util.List;
public class SysPermission implements Serializable {
@Id
@GeneratedValue
private Integer id;//主键.
private String name;//名称.
//主键.
private Integer id;
//名称.
private String name;
@Column(columnDefinition="enum('menu','button')")
private String resourceType;//资源类型,[menu|button]
private String url;//资源路径.
private String permission; //权限字符串,menu例子:role:*,button例子:role:create,role:update,role:delete,role:view
private Long parentId; //父编号
private String parentIds; //父编号列表
//资源类型,[menu|button]
private String resourceType;
//资源路径.
private String url;
//权限字符串,menu例子:role:*,button例子:role:create,role:update,role:delete,role:view
private String permission;
//父编号
private Long parentId;
//父编号列表
private String parentIds;
private Boolean available = Boolean.FALSE;
@ManyToMany
@JoinTable(name="SysRolePermission",joinColumns={@JoinColumn(name="permissionId")},inverseJoinColumns={@JoinColumn(name="roleId")})
......
package com.yxproject.start.mapper;
import com.yxproject.start.entity.SysPermission;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Options;
import org.springframework.stereotype.Repository;
import java.util.Map;
/**
* @author Administrator
*/
@Mapper
@Repository
public interface SysPermissionMapper {
// @Insert("INSERT INTO sys_permission (id,available,name,parent_id,parent_ids,permission,resource_type,url)\n" +
// "VALUES (PERMISSION_seq.nextval,false,'用户删除',1,'0/1','userInfo:del','button','userInfo/userDel')")
public void addPermissionByMap(SysPermission sysPermission);
}
......@@ -3,6 +3,7 @@ package com.yxproject.start.mapper;
import com.yxproject.start.entity.UserInfo;
import org.apache.ibatis.annotations.Mapper;
import org.springframework.data.repository.CrudRepository;
import org.springframework.stereotype.Repository;
import java.util.Map;
......@@ -10,8 +11,12 @@ import java.util.Map;
* @author Administrator
*/
@Mapper
public interface SystemUserMapper extends CrudRepository<UserInfo,Long> {
@Repository
public interface UserInfoMapper extends CrudRepository<UserInfo,Long> {
public UserInfo findUserByUsername(String username);
// public int addUserInfo(UserInfo userInfo);
// public int delUserInfo(int userInfoID);
// public int updateUserInfo(UserInfo userInfo);
}
package com.yxproject.start.service;
import com.yxproject.start.entity.SysPermission;
import java.util.Map;
public interface SysPermissionService {
public void addPermission(SysPermission sysPermission);
}
......@@ -4,9 +4,12 @@ import com.yxproject.start.entity.UserInfo;
import java.util.Map;
public interface SystemUserService {
public interface UserInfoService {
// public UserInfo findUserRoleMenu(Map<String,String> map);
public UserInfo findByUsername(String username);
// int addUsername( UserInfo userInfo);
// int delUsername( UserInfo userInfo);
// int updateUsername(UserInfo userInfo);
}
package com.yxproject.start.service.impl;
import com.yxproject.start.entity.UserInfo;
import com.yxproject.start.mapper.SystemUserMapper;
import com.yxproject.start.service.SystemUserService;
import com.yxproject.start.entity.SysPermission;
import com.yxproject.start.mapper.SysPermissionMapper;
import com.yxproject.start.service.SysPermissionService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.Map;
/**
* @author Administrator
*/
@Service
public class SystemUserServiceImpl implements SystemUserService {
public class SysPermissionServiceImpl implements SysPermissionService{
@Autowired
private SystemUserMapper systemUserMapper;
private SysPermissionMapper sysPermissionMapper;
@Override
public UserInfo findByUsername(String username) {
public void addPermission(SysPermission sysPermission) {
sysPermissionMapper.addPermissionByMap(sysPermission);
UserInfo user = systemUserMapper.findUserByUsername(username);
return user;
}
......
package com.yxproject.start.service.impl;
import com.yxproject.start.entity.UserInfo;
import com.yxproject.start.mapper.UserInfoMapper;
import com.yxproject.start.service.UserInfoService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
/**
* @author liboyang
*/
@Service
public class UserInfoServiceImpl implements UserInfoService {
@Autowired
private UserInfoMapper userInfoMapper;
@Override
public UserInfo findByUsername(String username) {
UserInfo user = userInfoMapper.findUserByUsername(username);
return user;
}
// @Override
// public int addUsername(UserInfo userInfo) {
// System.out.println("SystemUserService.addUsername(UserInfo userInfo)");
// userInfoMapper.addUserInfo(userInfo);
// return 1;
// }
//
// @Override
// public int delUsername(UserInfo userInfo) {
// userInfoMapper.delUserInfo(userInfo.getUid());
// return 1;
// }
// @Override
// public int updateUsername(UserInfo userInfo) {
// userInfoMapper.updateUserInfo(userInfo);
// return 1;
// }
}
......@@ -15,10 +15,6 @@ spring.datasource.password = dahai
spring.jpa.hibernate.ddl-auto= update
spring.jpa.show-sql=true
##jsp 支持
#spring.mvc.view.suffix=.jsp
#spring.mvc.view.prefix=/WEB-INF/jsp/
# thymeleaf
spring.thymeleaf.prefix=classpath:/templates/
spring.thymeleaf.suffix=.html
......
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.yxproject.start.mapper.SysPermissionMapper">
<resultMap id="PermissionMap" type="com.yxproject.start.entity.SysPermission">
<id column="id" property="id" />
<result column="name" property="name"/>
<result column="resource_type" property="resourceType"/>
<result column="url" property="url"/>
<result column="permission" property="permission"/>
<result column="parent_id" property="parentId"/>
<result column="parent_ids" property="parentIds"/>
<result column="available" property="available"/>
</resultMap>
<insert id="addPermissionByMap" parameterType="com.yxproject.start.entity.SysPermission">
Insert into DAHAI.SYS_PERMISSION (ID,AVAILABLE,NAME,PARENT_ID,PARENT_IDS,PERMISSION,RESOURCE_TYPE,URL) values (PERMISSION_seq.nextval,0,'用户管理',0,'0/','userInfo.view','menu','userList')
</insert>
</mapper>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.yxproject.start.mapper.SystemUserMapper">
<mapper namespace="com.yxproject.start.mapper.UserInfoMapper">
<!--&lt;!&ndash;用户&ndash;&gt;-->
<!--<resultMap id="UserRoleMenuMap" type="com.yxproject.start.entity.UserInfo">-->
<!--<id property="uid" column="uid"/>-->
......@@ -21,7 +21,28 @@
<!--</collection>-->
<!--</collection>-->
<!--</resultMap>-->
<!--<select id="findUserByUsername" resultMap="UserRoleMenuMap" parameterType="string">-->
<!--select user_info.uid,user_info.username,user_info.password,user_info.name,sys_role.id as rid,sys_role.role,sys_role.description,-->
<!--sys_permission.id as pid,sys_permission.name as pname,sys_permission.url-->
<!--from user_info-->
<!--left join sys_user_role on user_info.uid = sys_user_role.uid-->
<!--left join sys_role on sys_user_role.role_id= sys_role.id-->
<!--left join sys_role_permission on sys_role.id = sys_role_permission.permission_id-->
<!--left join sys_permission on sys_role_permission.permission_id = sys_permission.id-->
<!--where username=#{username}-->
<!--</select>-->
<!--<insert id = "addUserInfo" parameterType = "map" statementType = "PREPARED" keyProperty = "u_id" useGeneratedKeys = "true" >-->
<!--insert into USER_INFO (`u_id`,`username`,`name`,`password`,`salt`,`state`) VALUES (USER_INFO_seq.nextval, 'admin', '管理员', 'd3c59d25033dbf980d29554025c23a75', '8d78869f470951332959580424d4bf4f', 0)-->
<!--</insert>-->
<!--<update id = "delUserInfo" parameterType = "int" >-->
<!--update user_info set STATE = 1 where u_id =#{uId}-->
<!--</update>-->
<!--<update id = "updateUserInfo" parameterType = "map" >-->
<!--update user_info set username =#{username},name =#{name},password =#{password} where u_id =#{uId}-->
<!--</update>-->
<!--<select id="findUserByUsername" resultMap="UserRoleMenuMap" parameterType="string">-->
<!--select user_info.uid,user_info.username,user_info.password,user_info.name,sys_role.id as rid,sys_role.role,sys_role.description,-->
......
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.w3.org/1999/xhtml">
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="Thymeleaf"
xmlns:shiro="http://www.pollix.at/thymeleaf/shiro">
<head>
<meta charset="UTF-8">
<title>Login</title>
<!--<link rel="stylesheet" type="text/css" th:href="@{/css/bootstrap.theme.min.css}"/>-->
<link rel="stylesheet" type="text/css" href="../static/css/bootstrap.theme.min.css"/>
<link rel="stylesheet" type="text/css" href="../static/css/bootstrap.min.css"/>
<script type="text/javascript" src="../static/js/jquery.min.js"></script>
<script type="text/javascript" src="../static/js/bootstrap.min.js"></script>
<script type="text/javascript">
$(function () {
var dheight = $(document).height();
var lheight = $('#login').height();
$('#login').css('marginTop', (dheight - lheight) / 2 + 'px');
})
</script>
</head>
<body>
<body background="images\body_bg5.jpg">
错误信息:<h4 th:text="${msg}"></h4>
<form action="" method="post">
<p>账号:<input type="text" name="username" value="admin"/></p>
<p>密码:<input type="text" name="password" value="123456"/></p>
<p><input type="submit" value="登录"/></p>
</form>
<div class="container">
<div id="login" class="row">
<div class="col-xs-6 col-xs-offset-3">
<div class="panel panel-primary">
<div class="panel-heading">
<h3 class="panel-title">用户登录</h3>
</div>
<div class="panel-body" style="background: rgba(0, 0, 0, 0.1); box-shadow: 10px 10px 5px #888888">
<form class="form-horizontal" action="userLogin" method="POST">
<div class="form-group"></div>
<div class="form-group">
<label class="col-xs-3 control-label">用户名</label>
<div class="col-xs-9">
<input type="text" class="form-control" id="yhid"
name="username" placeholder="请输入用户名称">
</div>
</div>
<div class="form-group">
<label class="col-xs-3 control-label">密码</label>
<div class="col-xs-9">
<input type="password" class="form-control" id="passid"
name="password" placeholder="请输入密码">
</div>
</div>
<div class="form-group">
<div class="col-xs-offset-5 col-xs-2">
<button type="submit" class="btn btn-warning btn-block"> 登 录</button>
</div>
</div>
</form>
</div>
</div>
</div>
</div>
</div>
</body>
</html>
\ No newline at end of file
<!DOCTYPE html>
<html lang="en">
<html lang="en" xmlns:th="http://www.w3.org/1999/xhtml">
<head>
<meta charset="UTF-8">
<title>Add</title>
</head>
<body>
<h3>用户添加界面</h3>
<form action="" th:action="@{/permissionAdd}" method="post">
<p>名称:<input type="text" name="name" value="名称"/></p>
<p>资源类型:<input type="radio" name="resourceType" value="menu"/>menu
<input type="radio" name="resourceType" value="button"/>button</p>
<p>资源路径:<input type="text" name="url" value="userAdd"/></p>
<p>权限字符串:<input type="text" name="permission" value="userInfo.add"/></p>
<p>父编号:<input type="text" name="parentId" value="1"/></p>
<p>父编号列表:<input type="text" name="parentIds" value="0/1"/></p>
<p><input type="submit" value="添加"/></p>
</form>
</body>
</html>
\ No newline at end of file
1.项目部署:
将项目打包成jar,部署到服务器上,启动项目后在浏览器的地址栏输入localhost:8080,若进入登录页面即项目部署完成。
2.登录功能
进入登录页面后,输入用户名和密码,登录成功则页面跳转到该用户的操作页面,登录失败,页面上显示失败原因,比如用户不存在,密码错误等。
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment