Skip to content
Projects
Groups
Snippets
Help
Loading...
Sign in
Toggle navigation
Y
YX_IDENT_REFACTORING
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
zhangyusheng
YX_IDENT_REFACTORING
Commits
84362b1a
Commit
84362b1a
authored
Oct 10, 2018
by
liboyang
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
1.springboot+shiro+thymeleaf+mybatis+jersey实现用户登录认证
parent
c01b3aec
Hide whitespace changes
Inline
Side-by-side
Showing
26 changed files
with
845 additions
and
116 deletions
+845
-116
pom.xml
pom.xml
+28
-1
SystemUserApi.java
src/main/java/com/yx_project/start/api/SystemUserApi.java
+0
-47
SystemUserMapper.java
...in/java/com/yx_project/start/mapper/SystemUserMapper.java
+0
-13
SystemUserService.java
.../java/com/yx_project/start/service/SystemUserService.java
+0
-11
Main.java
src/main/java/com/yxproject/start/Main.java
+9
-3
ShiroApi.java
src/main/java/com/yxproject/start/api/ShiroApi.java
+93
-0
UserInfoApi.java
src/main/java/com/yxproject/start/api/UserInfoApi.java
+70
-0
JerseyConfig.java
src/main/java/com/yxproject/start/config/JerseyConfig.java
+3
-3
MyShiroRealm.java
src/main/java/com/yxproject/start/config/MyShiroRealm.java
+69
-0
ShiroConfig.java
src/main/java/com/yxproject/start/config/ShiroConfig.java
+112
-0
SysPermission.java
src/main/java/com/yxproject/start/entity/SysPermission.java
+96
-0
SysRole.java
src/main/java/com/yxproject/start/entity/SysRole.java
+73
-0
UserInfo.java
src/main/java/com/yxproject/start/entity/UserInfo.java
+89
-0
SystemUserMapper.java
...ain/java/com/yxproject/start/mapper/SystemUserMapper.java
+17
-0
SystemUserService.java
...n/java/com/yxproject/start/service/SystemUserService.java
+12
-0
SystemUserServiceImpl.java
...m/yxproject/start/service/impl/SystemUserServiceImpl.java
+9
-9
application.properties
src/main/resources/application.properties
+14
-0
import.sql
src/main/resources/database/import.sql
+14
-0
SystemUserMapper.xml
src/main/resources/mapper/SystemUserMapper.xml
+36
-28
403.html
src/main/resources/templates/403.html
+11
-0
index.html
src/main/resources/templates/index.html
+40
-0
login.html
src/main/resources/templates/login.html
+16
-0
userInfo.html
src/main/resources/templates/userInfo.html
+11
-0
userInfoAdd.html
src/main/resources/templates/userInfoAdd.html
+11
-0
userInfoDel.html
src/main/resources/templates/userInfoDel.html
+11
-0
MainTests.java
src/test/java/com/yxproject/start/MainTests.java
+1
-1
No files found.
pom.xml
View file @
84362b1a
...
...
@@ -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>
...
...
src/main/java/com/yx_project/start/api/SystemUserApi.java
deleted
100644 → 0
View file @
c01b3aec
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
;
}
}
}
src/main/java/com/yx_project/start/mapper/SystemUserMapper.java
deleted
100644 → 0
View file @
c01b3aec
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
);
}
src/main/java/com/yx_project/start/service/SystemUserService.java
deleted
100644 → 0
View file @
c01b3aec
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
);
}
src/main/java/com/yx
_
project/start/Main.java
→
src/main/java/com/yxproject/start/Main.java
View file @
84362b1a
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
()
{
...
...
src/main/java/com/yxproject/start/api/ShiroApi.java
0 → 100644
View file @
84362b1a
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"
;
}
}
src/main/java/com/yxproject/start/api/UserInfoApi.java
0 → 100644
View file @
84362b1a
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
;
}
}
src/main/java/com/yx
_
project/start/config/JerseyConfig.java
→
src/main/java/com/yxproject/start/config/JerseyConfig.java
View file @
84362b1a
package
com
.
yx
_
project
.
start
.
config
;
package
com
.
yxproject
.
start
.
config
;
import
com.yx
_project.start.api.SystemUser
Api
;
import
com.yx
project.start.api.UserInfo
Api
;
import
org.glassfish.jersey.server.ResourceConfig
;
public
class
JerseyConfig
extends
ResourceConfig
{
public
JerseyConfig
()
{
register
(
SystemUser
Api
.
class
);
register
(
UserInfo
Api
.
class
);
}
}
src/main/java/com/yxproject/start/config/MyShiroRealm.java
0 → 100644
View file @
84362b1a
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
src/main/java/com/yxproject/start/config/ShiroConfig.java
0 → 100644
View file @
84362b1a
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
src/main/java/com/yxproject/start/entity/SysPermission.java
0 → 100644
View file @
84362b1a
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
src/main/java/com/yxproject/start/entity/SysRole.java
0 → 100644
View file @
84362b1a
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
src/main/java/com/yxproject/start/entity/UserInfo.java
0 → 100644
View file @
84362b1a
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
src/main/java/com/yxproject/start/mapper/SystemUserMapper.java
0 → 100644
View file @
84362b1a
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
);
}
src/main/java/com/yxproject/start/service/SystemUserService.java
0 → 100644
View file @
84362b1a
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
);
}
src/main/java/com/yx
_
project/start/service/impl/SystemUserServiceImpl.java
→
src/main/java/com/yxproject/start/service/impl/SystemUserServiceImpl.java
View file @
84362b1a
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
;
}
...
...
src/main/resources/application.properties
View file @
84362b1a
...
...
@@ -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
src/main/resources/database/import.sql
0 → 100644
View file @
84362b1a
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
src/main/resources/mapper/SystemUserMapper.xml
View file @
84362b1a
<?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"
>
<!--<!–用户–>-->
<!--<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"/>-->
<!--<!–角色集合–>-->
<!--<collection property="roleList" ofType="com.yxproject.start.entity.SysRole">-->
<!--<id column="id" property="rid" />-->
<!--<result column="description" property="description"/>-->
<!--<result column="role" property="role"/>-->
<!--<!–权限集合–>-->
<!--<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
src/main/resources/templates/403.html
0 → 100644
View file @
84362b1a
<!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
src/main/resources/templates/index.html
0 → 100644
View file @
84362b1a
<!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>
src/main/resources/templates/login.html
0 → 100644
View file @
84362b1a
<!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
src/main/resources/templates/userInfo.html
0 → 100644
View file @
84362b1a
<!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
src/main/resources/templates/userInfoAdd.html
0 → 100644
View file @
84362b1a
<!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
src/main/resources/templates/userInfoDel.html
0 → 100644
View file @
84362b1a
<!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
src/test/java/com/yx
_
project/start/MainTests.java
→
src/test/java/com/yxproject/start/MainTests.java
View file @
84362b1a
package
com
.
yx
_
project
.
start
;
package
com
.
yxproject
.
start
;
import
org.junit.Test
;
import
org.junit.runner.RunWith
;
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment