Commit 84362b1a authored by liboyang's avatar liboyang

1.springboot+shiro+thymeleaf+mybatis+jersey实现用户登录认证

parent c01b3aec
......@@ -46,23 +46,50 @@
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
</dependency>
<!--引入log4j2作为日志组件-->
<!--<dependency>-->
<!--<groupId>org.springframework.boot</groupId>-->
<!--<artifactId>spring-boot-starter-log4j2</artifactId>-->
<!--</dependency>-->
<!-- shiro相关 -->
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-core</artifactId>
<version>1.4.0</version>
</dependency>
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-spring</artifactId>
<version>1.4.0</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>com.github.theborakompanioni</groupId>
<artifactId>thymeleaf-extras-shiro</artifactId>
<version>2.0.0</version>
</dependency>
</dependencies>
......
package com.yx_project.start.api;
import com.yx_project.start.entity.SystemUserEntity;
import com.yx_project.start.service.impl.SystemUserServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import javax.servlet.http.HttpServletResponse;
import javax.ws.rs.*;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.MediaType;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@Path("user")
public class SystemUserApi {
@Autowired
private SystemUserServiceImpl userService;
/**
* 用户登陆返回该用户的功能列表
*
*/
@GET
@Path("UserLogin")
@Produces(MediaType.APPLICATION_JSON)
public Map<String, Object> userLogin(@QueryParam("username") String username, @QueryParam("password") String password, @Context HttpServletResponse response) {
response.setCharacterEncoding("UTF-8");
Map<String,String> userMap = new HashMap();
userMap.put("username",username);
userMap.put("password",password);
SystemUserEntity user = userService.findUserRoleMenu(userMap);
Map<String,Object> returnMap = new HashMap<>();
if(user==null){
returnMap.put("returnCode", "0");
returnMap.put("returnMsg", "用户名或密码错误");
return returnMap;
} else {
returnMap.put("returnCode", "1");
returnMap.put("returnMsg", "登陆成功");
returnMap.put("user", user);
return returnMap;
}
}
}
package com.yx_project.start.mapper;
import com.yx_project.start.entity.SystemUserEntity;
import org.apache.ibatis.annotations.Mapper;
import java.util.List;
import java.util.Map;
@Mapper
public interface SystemUserMapper {
public SystemUserEntity findUserRoleMenu(Map<String,String> map);
}
package com.yx_project.start.service;
import com.yx_project.start.entity.SystemUserEntity;
import java.util.List;
import java.util.Map;
public interface SystemUserService {
public SystemUserEntity findUserRoleMenu(Map<String,String> map);
}
package com.yx_project.start;
package com.yxproject.start;
import com.yx_project.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;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
import org.springframework.context.annotation.Bean;
/**
* @author Administrator
*/
@SpringBootApplication
public class Main {
public class Main{
@Bean
public ServletRegistrationBean jerseyServlet() {
......
package com.yxproject.start.api;
import com.yxproject.start.entity.SysPermission;
import com.yxproject.start.entity.SysRole;
import com.yxproject.start.entity.UserInfo;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.IncorrectCredentialsException;
import org.apache.shiro.authc.UnknownAccountException;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.apache.shiro.subject.Subject;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import javax.servlet.http.HttpServletRequest;
import java.util.Map;
/**
* @author Administrator
*/
@Controller
public class ShiroApi {
@RequestMapping(value={"/","/index"})
public String index(Map<String,Object> map){
System.out.println("HomeController.index()");
//获取到用户信息;
Subject subject = SecurityUtils.getSubject();
UserInfo ui = (UserInfo) subject.getPrincipal();
for(SysRole role:ui.getRoleList()){
for(SysPermission memu:role.getPermissions()){
System.out.println(memu.getPermission()+","+memu.getUrl());
}
}
map.put("userInfo",ui);
return "/index";
}
@RequestMapping("/userLogin")
public String login(HttpServletRequest request, Map<String, Object> map) throws Exception {
System.out.println("HomeController.login()");
// 登录失败从request中获取shiro处理的异常信息。
// shiroLoginFailure:就是shiro异常类的全类名.
String exception = (String) request.getAttribute("shiroLoginFailure");
System.out.println("exception=" + exception);
String msg = "";
if (exception != null) {
if (UnknownAccountException.class.getName().equals(exception)) {
System.out.println("UnknownAccountException -- > 账号不存在:");
msg = "UnknownAccountException -- > 账号不存在:";
} else if (IncorrectCredentialsException.class.getName().equals(exception)) {
System.out.println("IncorrectCredentialsException -- > 密码不正确:");
msg = "IncorrectCredentialsException -- > 密码不正确:";
} else if ("kaptchaValidateFailed".equals(exception)) {
System.out.println("kaptchaValidateFailed -- > 验证码错误");
msg = "kaptchaValidateFailed -- > 验证码错误";
} else {
msg = "else >> " + exception;
System.out.println("else -- >" + exception);
}
}
map.put("msg", msg);
// 此方法不处理登录成功,由shiro进行处理
return "/login";
}
/**
* 用户添加;
* @return
*/
@RequestMapping("/userAdd")
@RequiresPermissions("userInfo.del")//权限管理;
public String userInfoAdd(){
return "userInfoAdd";
}
/**
* 用户查询.
* @return
*/
@RequestMapping("/userList")
@RequiresPermissions("userInfo.view")//权限管理;
public String userInfo(){
return "userInfo";
}
/**
* 用户删除;
* @return
*/
@RequestMapping("/userDel")
@RequiresPermissions("userInfo.del")//权限管理;
public String userDel(){
return "userInfoDel";
}
}
package com.yxproject.start.api;
import com.yxproject.start.entity.UserInfo;
import com.yxproject.start.service.SystemUserService;
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.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 javax.ws.rs.*;
import javax.ws.rs.core.MediaType;
import java.awt.*;
import java.util.LinkedHashMap;
import java.util.Map;
@Path("user")
/**
* @author Administrator
*/
public class UserInfoApi {
@Autowired
private SystemUserService systemUserService;
@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", "账号不存在");
}
return resultMap;
}
@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 resultMap;
}
}
package com.yx_project.start.config;
package com.yxproject.start.config;
import com.yx_project.start.api.SystemUserApi;
import com.yxproject.start.api.UserInfoApi;
import org.glassfish.jersey.server.ResourceConfig;
public class JerseyConfig extends ResourceConfig {
public JerseyConfig() {
register(SystemUserApi.class);
register(UserInfoApi.class);
}
}
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 org.apache.shiro.authc.AuthenticationException;
import org.apache.shiro.authc.AuthenticationInfo;
import org.apache.shiro.authc.AuthenticationToken;
import org.apache.shiro.authc.SimpleAuthenticationInfo;
import org.apache.shiro.authz.AuthorizationInfo;
import org.apache.shiro.authz.SimpleAuthorizationInfo;
import org.apache.shiro.realm.AuthorizingRealm;
import org.apache.shiro.subject.PrincipalCollection;
import org.springframework.beans.factory.annotation.Autowired;
/**
* @author Administrator
*/
public class MyShiroRealm extends AuthorizingRealm {
@Autowired
private SystemUserService systemUserService;
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
System.out.println(principals.getPrimaryPrincipal());
System.out.println("权限配置-->MyShiroRealm.doGetAuthorizationInfo()");
SimpleAuthorizationInfo authorizationInfo = new SimpleAuthorizationInfo();
UserInfo user = (UserInfo)principals.getPrimaryPrincipal();
for(SysRole role:user.getRoleList()){
authorizationInfo.addRole(role.getRole());
for(SysPermission memu:role.getPermissions()){
authorizationInfo.addStringPermission(memu.getPermission());
}
}
return authorizationInfo;
}
/**
*
* @param token
* @return
* @throws AuthenticationException
*/
@Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token)
throws AuthenticationException {
System.out.println("MyShiroRealm.doGetAuthenticationInfo()");
//获取用户的输入的账号.
String username = (String)token.getPrincipal();
System.out.println(username);
System.out.println(token.getCredentials().toString());
//通过username从数据库中查找 User对象,如果找到,没找到.
//实际项目中,这里可以根据实际情况做缓存,如果不做,Shiro自己也是有时间间隔机制,2分钟内不会重复执行该方法
UserInfo user = systemUserService.findByUsername(username);
if(user == null){
return null;
}
SimpleAuthenticationInfo authenticationInfo = new SimpleAuthenticationInfo(
user,
user.getPassword(),
getName()
);
return authenticationInfo;
}
}
\ No newline at end of file
package com.yxproject.start.config;
import at.pollux.thymeleaf.shiro.dialect.ShiroDialect;
import org.apache.shiro.authc.credential.HashedCredentialsMatcher;
import org.apache.shiro.mgt.SecurityManager;
import org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor;
import org.apache.shiro.spring.web.ShiroFilterFactoryBean;
import org.apache.shiro.web.mgt.DefaultWebSecurityManager;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.handler.SimpleMappingExceptionResolver;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Properties;
/**
* @author Administrator
*/
@Configuration
public class ShiroConfig {
@Bean
public ShiroFilterFactoryBean shirFilter(SecurityManager securityManager) {
System.out.println("ShiroConfiguration.shiroFilter()");
ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();
shiroFilterFactoryBean.setSecurityManager(securityManager);
//拦截器.
Map<String,String> filterChainDefinitionMap = new LinkedHashMap<String,String>();
// 配置不会被拦截的链接 顺序判断
filterChainDefinitionMap.put("/static/**", "anon");
//配置退出 过滤器,其中的具体的退出代码Shiro已经替我们实现了
filterChainDefinitionMap.put("/logout", "logout");
//<!-- 过滤链定义,从上向下顺序执行,一般将/**放在最为下边 -->:这是一个坑呢,一不小心代码就不好使了;
// 如果不设置默认会自动寻找Web工程根目录下的"/login.jsp"页面
shiroFilterFactoryBean.setLoginUrl("/userLogin");
// 登录成功后要跳转的链接
shiroFilterFactoryBean.setSuccessUrl("/index");
//<!-- authc:所有url都必须认证通过才可以访问; anon:所有url都都可以匿名访问-->
filterChainDefinitionMap.put("/**", "authc");
//未授权界面;
shiroFilterFactoryBean.setUnauthorizedUrl("/403");
shiroFilterFactoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap);
return shiroFilterFactoryBean;
}
/**
* 凭证匹配器
* (由于我们的密码校验交给Shiro的SimpleAuthenticationInfo进行处理了
* )
* @return
*/
@Bean
public HashedCredentialsMatcher hashedCredentialsMatcher(){
HashedCredentialsMatcher hashedCredentialsMatcher = new HashedCredentialsMatcher();
//散列算法:这里使用MD5算法;
hashedCredentialsMatcher.setHashAlgorithmName("md5");
//散列的次数,比如散列两次,相当于 md5("");
hashedCredentialsMatcher.setHashIterations(1);
return hashedCredentialsMatcher;
}
@Bean
public MyShiroRealm myShiroRealm(){
MyShiroRealm myShiroRealm = new MyShiroRealm();
myShiroRealm.setCredentialsMatcher(hashedCredentialsMatcher());
return myShiroRealm;
}
@Bean
public SecurityManager securityManager(){
DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
securityManager.setRealm(myShiroRealm());
return securityManager;
}
/**
* 开启shiro aop注解支持.
* 使用代理方式;所以需要开启代码支持;
* @param securityManager
* @return
*/
@Bean
public AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor(SecurityManager securityManager){
AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor = new AuthorizationAttributeSourceAdvisor();
authorizationAttributeSourceAdvisor.setSecurityManager(securityManager);
return authorizationAttributeSourceAdvisor;
}
@Bean(name="simpleMappingExceptionResolver")
public SimpleMappingExceptionResolver
createSimpleMappingExceptionResolver() {
SimpleMappingExceptionResolver r = new SimpleMappingExceptionResolver();
Properties mappings = new Properties();
//数据库异常处理
mappings.setProperty("DatabaseException", "databaseError");
mappings.setProperty("UnauthorizedException","403");
r.setExceptionMappings(mappings);
r.setDefaultErrorView("error");
r.setExceptionAttribute("ex");
return r;
}
@Bean(name = "shiroDialect")
public ShiroDialect shiroDialect(){
return new ShiroDialect();
}
}
\ No newline at end of file
package com.yxproject.start.entity;
import javax.persistence.*;
import java.io.Serializable;
import java.util.List;
@Entity
public class SysPermission implements Serializable {
@Id
@GeneratedValue
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; //父编号列表
private Boolean available = Boolean.FALSE;
@ManyToMany
@JoinTable(name="SysRolePermission",joinColumns={@JoinColumn(name="permissionId")},inverseJoinColumns={@JoinColumn(name="roleId")})
private List<SysRole> roles;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getResourceType() {
return resourceType;
}
public void setResourceType(String resourceType) {
this.resourceType = resourceType;
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public String getPermission() {
return permission;
}
public void setPermission(String permission) {
this.permission = permission;
}
public Long getParentId() {
return parentId;
}
public void setParentId(Long parentId) {
this.parentId = parentId;
}
public String getParentIds() {
return parentIds;
}
public void setParentIds(String parentIds) {
this.parentIds = parentIds;
}
public Boolean getAvailable() {
return available;
}
public void setAvailable(Boolean available) {
this.available = available;
}
public List<SysRole> getRoles() {
return roles;
}
public void setRoles(List<SysRole> roles) {
this.roles = roles;
}
}
\ No newline at end of file
package com.yxproject.start.entity;
import javax.persistence.*;
import java.util.List;
@Entity
public class SysRole {
@Id
@GeneratedValue
private Integer id; // 编号
private String role; // 角色标识程序中判断使用,如"admin",这个是唯一的:
private String description; // 角色描述,UI界面显示使用
private Boolean available = Boolean.FALSE; // 是否可用,如果不可用将不会添加给用户
//角色 -- 权限关系:多对多关系;
@ManyToMany(fetch= FetchType.EAGER)
@JoinTable(name="SysRolePermission",joinColumns={@JoinColumn(name="roleId")},inverseJoinColumns={@JoinColumn(name="permissionId")})
private List<SysPermission> permissions;
// 用户 - 角色关系定义;
@ManyToMany
@JoinTable(name="SysUserRole",joinColumns={@JoinColumn(name="roleId")},inverseJoinColumns={@JoinColumn(name="uId")})
private List<UserInfo> userInfos;// 一个角色对应多个用户
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getRole() {
return role;
}
public void setRole(String role) {
this.role = role;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public Boolean getAvailable() {
return available;
}
public void setAvailable(Boolean available) {
this.available = available;
}
public List<SysPermission> getPermissions() {
return permissions;
}
public void setPermissions(List<SysPermission> permissions) {
this.permissions = permissions;
}
public List<UserInfo> getUserInfos() {
return userInfos;
}
public void setUserInfos(List<UserInfo> userInfos) {
this.userInfos = userInfos;
}
}
\ No newline at end of file
package com.yxproject.start.entity;
import com.yxproject.start.entity.SysRole;
import javax.persistence.*;
import java.io.Serializable;
import java.util.List;
@Entity
public class UserInfo implements Serializable {
@Id
@GeneratedValue
private Integer uId;
@Column(unique =true)
private String username;//帐号
private String name;//名称(昵称或者真实姓名,不同系统不同定义)
private String password; //密码;
private String salt;//加密密码的盐
private byte state;//用户状态,0:创建未认证(比如没有激活,没有输入验证码等等)--等待验证的用户 , 1:正常状态,2:用户被锁定.
@ManyToMany(fetch= FetchType.EAGER)//立即从数据库中进行加载数据;
@JoinTable(name = "SysUserRole", joinColumns = { @JoinColumn(name = "uId") }, inverseJoinColumns ={@JoinColumn(name = "roleId") })
private List<SysRole> roleList;// 一个用户具有多个角色
public Integer getUid() {
return uId;
}
public void setUid(Integer uid) {
this.uId = uId;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getSalt() {
return salt;
}
public void setSalt(String salt) {
this.salt = salt;
}
public byte getState() {
return state;
}
public void setState(byte state) {
this.state = state;
}
public List<SysRole> getRoleList() {
return roleList;
}
public void setRoleList(List<SysRole> roleList) {
this.roleList = roleList;
}
/**
* 密码盐.
* @return
*/
public String getCredentialsSalt(){
return this.username+this.salt;
}
//重新对盐重新进行了定义,用户名+salt,这样就更加不容易被破解
}
\ No newline at end of file
package com.yxproject.start.mapper;
import com.yxproject.start.entity.UserInfo;
import org.apache.ibatis.annotations.Mapper;
import org.springframework.data.repository.CrudRepository;
import java.util.Map;
/**
* @author Administrator
*/
@Mapper
public interface SystemUserMapper extends CrudRepository<UserInfo,Long> {
public UserInfo findUserByUsername(String username);
}
package com.yxproject.start.service;
import com.yxproject.start.entity.UserInfo;
import java.util.Map;
public interface SystemUserService {
// public UserInfo findUserRoleMenu(Map<String,String> map);
public UserInfo findByUsername(String username);
}
package com.yx_project.start.service.impl;
package com.yxproject.start.service.impl;
import com.yx_project.start.entity.SystemUserEntity;
import com.yx_project.start.mapper.SystemUserMapper;
import com.yx_project.start.service.SystemUserService;
import org.springframework.stereotype.Service;
import com.yxproject.start.entity.UserInfo;
import com.yxproject.start.mapper.SystemUserMapper;
import com.yxproject.start.service.SystemUserService;
import org.springframework.beans.factory.annotation.Autowired;
import java.util.List;
import org.springframework.stereotype.Service;
import java.util.Map;
@Service
......@@ -14,11 +14,11 @@ public class SystemUserServiceImpl implements SystemUserService {
@Autowired
private SystemUserMapper systemUserMapper;
@Override
public SystemUserEntity findUserRoleMenu(Map<String, String> map) {
public UserInfo findByUsername(String username) {
UserInfo user = systemUserMapper.findUserByUsername(username);
SystemUserEntity user = systemUserMapper.findUserRoleMenu(map);
return user;
}
......
......@@ -11,3 +11,17 @@ spring.datasource.url = jdbc:oracle:thin:@192.168.10.208:1521:GTYX
spring.datasource.username = dahai
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
spring.thymeleaf.mode=HTML
spring.thymeleaf.encoding=UTF-8
INSERT INTO `user_info` (`uid`,`username`,`name`,`password`,`salt`,`state`) VALUES ('1', 'admin', '管理员', 'd3c59d25033dbf980d29554025c23a75', '8d78869f470951332959580424d4bf4f', 0);
INSERT INTO `user_info` (`uid`,`username`,`name`,`password`,`salt`,`state`) VALUES ('2', 'zhangsan', '普通员工','d3c59d25033dbf980d29554025c23a75', '8d78869f470951332959580424d4bf4f', 0);
INSERT INTO `sys_permission` (`id`,`available`,`name`,`parent_id`,`parent_ids`,`permission`,`resource_type`,`url`) VALUES (1,0,'用户管理',0,'0/','userInfo:view','menu','userInfo/userList');
INSERT INTO `sys_permission` (`id`,`available`,`name`,`parent_id`,`parent_ids`,`permission`,`resource_type`,`url`) VALUES (2,0,'用户添加',1,'0/1','userInfo:add','button','userInfo/userAdd');
INSERT INTO `sys_permission` (`id`,`available`,`name`,`parent_id`,`parent_ids`,`permission`,`resource_type`,`url`) VALUES (3,0,'用户删除',1,'0/1','userInfo:del','button','userInfo/userDel');
INSERT INTO `sys_role` (`id`,`available`,`description`,`role`) VALUES (1,0,'管理员','admin');
INSERT INTO `sys_role` (`id`,`available`,`description`,`role`) VALUES (2,0,'VIP会员','vip');
INSERT INTO `sys_role` (`id`,`available`,`description`,`role`) VALUES (3,1,'test','test');
INSERT INTO `sys_role_permission` VALUES ('1', '1');
INSERT INTO `sys_role_permission` (`permission_id`,`role_id`) VALUES (1,1);
INSERT INTO `sys_role_permission` (`permission_id`,`role_id`) VALUES (2,1);
INSERT INTO `sys_role_permission` (`permission_id`,`role_id`) VALUES (3,2);
INSERT INTO `sys_user_role` (`role_id`,`uid`) VALUES (1,1);
\ 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.yx_project.start.mapper.SystemUserMapper">
<!--用户-->
<resultMap id="UserRoleMenuMap" type="com.yx_project.start.entity.SystemUserEntity">
<id property="id" column="id"/>
<result column="uname" property="username"/>
<result column="upass" property="password"/>
<result column="workshop" property="workshop"/>
<!--角色集合-->
<collection property="roleEntityList" ofType="com.yx_project.start.entity.SystemRoleEntity">
<id column="rid" property="roleId" />
<result column="rname" property="roleName"/>
<!--权限集合-->
<collection property="menuEntityList" ofType="com.yx_project.start.entity.SystemMenuEntity">
<id column="mid" property="menuId" />
<result column="mname" property="menuName"/>
<result column="menu" property="menu"/>
</collection>
</collection>
</resultMap>
<mapper namespace="com.yxproject.start.mapper.SystemUserMapper">
<!--&lt;!&ndash;用户&ndash;&gt;-->
<!--<resultMap id="UserRoleMenuMap" type="com.yxproject.start.entity.UserInfo">-->
<!--<id property="uid" column="uid"/>-->
<!--<result column="username" property="username"/>-->
<!--<result column="password" property="password"/>-->
<!--<result column="state" property="state"/>-->
<!--<result column="name" property="name"/>-->
<!--&lt;!&ndash;角色集合&ndash;&gt;-->
<!--<collection property="roleList" ofType="com.yxproject.start.entity.SysRole">-->
<!--<id column="id" property="rid" />-->
<!--<result column="description" property="description"/>-->
<!--<result column="role" property="role"/>-->
<!--&lt;!&ndash;权限集合&ndash;&gt;-->
<!--<collection property="permissions" ofType="com.yxproject.start.entity.SysPermission">-->
<!--<id column="id" property="pid" />-->
<!--<result column="name" property="pname"/>-->
<!--<result column="url" property="url"/>-->
<!--</collection>-->
<!--</collection>-->
<!--</resultMap>-->
<select id="findUserRoleMenu" resultMap="UserRoleMenuMap" parameterType="map">
select "SYSTEM_USER".id,SYSTEM_USER.username as uname,SYSTEM_USER.password as upass,SYSTEM_USER.workshop,SYSTEM_ROLE.role_id as rid,SYSTEM_ROLE.role_name as rname,
SYSTEM_MENU.MENU_ID mid,SYSTEM_MENU.MENU_NAME mname,SYSTEM_MENU.MENU
from "SYSTEM_USER"
left join SYSTEM_ROLE on SYSTEM_USER.role_id = SYSTEM_ROLE.ROLE_ID
left join SYSTEM_ROLE_MENU on SYSTEM_ROLE.ROLE_ID = SYSTEM_ROLE_MENU.ROLE_ID
left join SYSTEM_MENU on SYSTEM_ROLE_MENU.ROLE_MENU_ID = SYSTEM_MENU.MENU_ID
where username=#{username} and password=#{password}
</select>
<!--<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>-->
<!--<select id="findUserByUsername" resultType="com.yxproject.start.entity.SystemUserEntity" parameterType="String">-->
<!--select * from "SYSTEM_USER" where username=#{username}-->
<!--</select>-->
</mapper>
\ No newline at end of file
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>403</title>
</head>
<body>
<h3>403没有权限</h3>
</body>
</html>
\ No newline at end of file
<!DOCTYPE html>
<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>Insert title here</title>
</head>
<body>
<h3>主界面--<span th:text="'登录账号:'+${userInfo.username}+'--名称:'+${userInfo.name}">user</span></h3> <a href="/logout">退出</a>
<hr />
<!-- 这些实际从数据库中进行查询,可以在 -->
<h5>这是通过shiro标签的方式;</h5>
<p shiro:hasRole="admin">
<a>管理员角色</a>
</p>
<p shiro:hasRole="zhangsan">
<a>张三</a>
</p>
<p shiro:hasPermission="userInfo.list">
<a href="/userList">用户查询</a>
</p>
<p shiro:hasPermission="userInfo.add">
<a href="/userAdd">用户添加</a>
</p>
<hr />
<h5>从数据库加载菜单</h5>
<div th:each="roleList:${userInfo.roleList}">
<span th:text="${roleList.description}"></span>
<!-- 角色下所有的所有菜单,实际开发中,只需要获取所有的权限就可以了,无所谓是哪个角色的; -->
<p style="color:blue;margin-left:30px;" th:each="permission:${roleList.permissions}">
<a th:href="${permission.url}" th:text="${permission.name}"></a>
</p>
</div>
</body>
</html>
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.w3.org/1999/xhtml">
<head>
<meta charset="UTF-8">
<title>Login</title>
</head>
<body>
错误信息:<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>
</body>
</html>
\ No newline at end of file
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>UserInfo</title>
</head>
<body>
<h3>用户查询界面</h3>
</body>
</html>
\ No newline at end of file
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Add</title>
</head>
<body>
<h3>用户添加界面</h3>
</body>
</html>
\ No newline at end of file
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Del</title>
</head>
<body>
<h3>用户删除界面</h3>
</body>
</html>
\ No newline at end of file
package com.yx_project.start;
package com.yxproject.start;
import org.junit.Test;
import org.junit.runner.RunWith;
......
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