Skip to content
GitLab
Menu
Projects
Groups
Snippets
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
jinli gu
Eladmin
Commits
3d74dac9
"eladmin-system/vscode:/vscode.git/clone" did not exist on "10dcf6e11b5c4dc42eee8b133ad545ecbb4e7a00"
Commit
3d74dac9
authored
Dec 22, 2018
by
郑杰
Browse files
eladmin 1.0 版本发布
parents
Changes
88
Hide whitespace changes
Inline
Side-by-side
src/main/java/me/zhengjie/common/utils/PageUtil.java
0 → 100644
View file @
3d74dac9
package
me.zhengjie.common.utils
;
import
org.springframework.data.domain.Page
;
import
java.util.ArrayList
;
import
java.util.HashMap
;
import
java.util.List
;
import
java.util.Map
;
/**
* 分页工具
*
* @author jie
* @date 2018-12-10
*/
public
class
PageUtil
{
/**
* List 分页
* @param page
* @param size
* @param list
* @return
*/
public
static
List
toPage
(
int
page
,
int
size
,
List
list
)
{
int
fromIndex
=
page
*
size
;
int
toIndex
=
page
*
size
+
size
;
if
(
fromIndex
>
list
.
size
()){
return
new
ArrayList
();
}
else
if
(
toIndex
>=
list
.
size
())
{
return
list
.
subList
(
fromIndex
,
list
.
size
());
}
else
{
return
list
.
subList
(
fromIndex
,
toIndex
);
}
}
/**
* Page 数据处理,预防redis反序列化报错
* @param page
* @return
*/
public
static
Map
toPage
(
Page
page
)
{
Map
map
=
new
HashMap
();
map
.
put
(
"content"
,
page
.
getContent
());
map
.
put
(
"totalElements"
,
page
.
getTotalElements
());
return
map
;
}
}
src/main/java/me/zhengjie/common/utils/RequestHolder.java
0 → 100644
View file @
3d74dac9
package
me.zhengjie.common.utils
;
import
org.springframework.web.context.request.RequestContextHolder
;
import
org.springframework.web.context.request.ServletRequestAttributes
;
import
javax.servlet.http.HttpServletRequest
;
/**
* 获取 HttpServletRequest
* @author jie
* @date 2018-11-24
*/
public
class
RequestHolder
{
public
static
HttpServletRequest
getHttpServletRequest
()
{
return
((
ServletRequestAttributes
)
RequestContextHolder
.
getRequestAttributes
()).
getRequest
();
}
}
src/main/java/me/zhengjie/common/utils/TimeUtil.java
0 → 100644
View file @
3d74dac9
package
me.zhengjie.common.utils
;
import
java.util.Calendar
;
import
java.util.Date
;
/**
* @author jie
* @date 2018-12-13
*
* 日期工具
*/
public
class
TimeUtil
{
public
static
String
getWeekDay
(){
String
[]
weekDays
=
{
"Sun"
,
"Mon"
,
"Tue"
,
"Wed"
,
"Thu"
,
"Fri"
,
"Sat"
};
Calendar
cal
=
Calendar
.
getInstance
();
cal
.
setTime
(
new
Date
());
int
w
=
cal
.
get
(
Calendar
.
DAY_OF_WEEK
)
-
1
;
if
(
w
<
0
){
w
=
0
;
}
return
weekDays
[
w
];
}
}
src/main/java/me/zhengjie/common/utils/ValidationUtil.java
0 → 100644
View file @
3d74dac9
package
me.zhengjie.common.utils
;
import
me.zhengjie.common.exception.BadRequestException
;
import
java.util.Optional
;
/**
* 验证工具
* @author jie
* @date 2018-11-23
*/
public
class
ValidationUtil
{
/**
* 验证空
* @param optional
*/
public
static
void
isNull
(
Optional
optional
,
String
entity
,
String
parameter
,
Object
value
){
if
(!
optional
.
isPresent
()){
String
msg
=
entity
+
" 不存在 "
+
"{ "
+
parameter
+
":"
+
value
.
toString
()
+
" }"
;
throw
new
BadRequestException
(
msg
);
}
}
/**
* 验证是否为邮箱
* @param string
* @return
*/
public
static
boolean
isEmail
(
String
string
)
{
if
(
string
==
null
){
return
false
;
}
String
regEx1
=
"^([a-z0-9A-Z]+[-|\\.]?)+[a-z0-9A-Z]@([a-z0-9A-Z]+(-[a-z0-9A-Z]+)?\\.)+[a-zA-Z]{2,}$"
;
return
string
.
matches
(
regEx1
);
}
}
src/main/java/me/zhengjie/core/config/CorsConfig.java
0 → 100644
View file @
3d74dac9
package
me.zhengjie.core.config
;
import
org.springframework.context.annotation.Configuration
;
import
org.springframework.web.servlet.config.annotation.CorsRegistry
;
import
org.springframework.web.servlet.config.annotation.EnableWebMvc
;
import
org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry
;
import
org.springframework.web.servlet.config.annotation.WebMvcConfigurer
;
/**
* 跨域请求
*
* @author jie
* @date 2018-11-30
*/
@Configuration
@EnableWebMvc
public
class
CorsConfig
implements
WebMvcConfigurer
{
@Override
public
void
addCorsMappings
(
CorsRegistry
registry
)
{
//设置允许跨域的路径
registry
.
addMapping
(
"/**"
)
//设置允许跨域请求的域名
.
allowedOrigins
(
"*"
)
//是否允许证书 不再默认开启
.
allowCredentials
(
true
)
//设置允许的方法
.
allowedMethods
(
"*"
)
//跨域允许时间
.
maxAge
(
3600
);
}
@Override
public
void
addResourceHandlers
(
ResourceHandlerRegistry
registry
)
{
registry
.
addResourceHandler
(
"/**"
).
addResourceLocations
(
"classpath:/META-INF/resources/"
).
setCachePeriod
(
0
);
}
}
src/main/java/me/zhengjie/core/config/WebSecurityConfig.java
0 → 100644
View file @
3d74dac9
package
me.zhengjie.core.config
;
import
me.zhengjie.core.security.JwtAuthenticationEntryPoint
;
import
me.zhengjie.core.security.JwtAuthorizationTokenFilter
;
import
me.zhengjie.core.service.JwtUserDetailsService
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.beans.factory.annotation.Value
;
import
org.springframework.context.annotation.Bean
;
import
org.springframework.context.annotation.Configuration
;
import
org.springframework.http.HttpMethod
;
import
org.springframework.security.authentication.AuthenticationManager
;
import
org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder
;
import
org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity
;
import
org.springframework.security.config.annotation.web.builders.HttpSecurity
;
import
org.springframework.security.config.annotation.web.builders.WebSecurity
;
import
org.springframework.security.config.annotation.web.configuration.EnableWebSecurity
;
import
org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter
;
import
org.springframework.security.config.http.SessionCreationPolicy
;
import
org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder
;
import
org.springframework.security.crypto.password.PasswordEncoder
;
import
org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter
;
@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity
(
prePostEnabled
=
true
)
public
class
WebSecurityConfig
extends
WebSecurityConfigurerAdapter
{
@Autowired
private
JwtAuthenticationEntryPoint
unauthorizedHandler
;
@Autowired
private
JwtUserDetailsService
jwtUserDetailsService
;
/**
* 自定义基于JWT的安全过滤器
*/
@Autowired
JwtAuthorizationTokenFilter
authenticationTokenFilter
;
@Value
(
"${jwt.header}"
)
private
String
tokenHeader
;
@Value
(
"${jwt.auth.path}"
)
private
String
authenticationPath
;
@Autowired
public
void
configureGlobal
(
AuthenticationManagerBuilder
auth
)
throws
Exception
{
auth
.
userDetailsService
(
jwtUserDetailsService
)
.
passwordEncoder
(
passwordEncoderBean
());
}
@Bean
public
PasswordEncoder
passwordEncoderBean
()
{
return
new
BCryptPasswordEncoder
();
}
@Bean
@Override
public
AuthenticationManager
authenticationManagerBean
()
throws
Exception
{
return
super
.
authenticationManagerBean
();
}
@Override
protected
void
configure
(
HttpSecurity
httpSecurity
)
throws
Exception
{
httpSecurity
// 禁用 CSRF
.
csrf
().
disable
()
// 授权异常
.
exceptionHandling
().
authenticationEntryPoint
(
unauthorizedHandler
).
and
()
// 不创建会话
.
sessionManagement
().
sessionCreationPolicy
(
SessionCreationPolicy
.
STATELESS
).
and
()
.
authorizeRequests
()
.
antMatchers
(
"/auth/**"
).
permitAll
()
.
antMatchers
(
"/druid/**"
).
anonymous
()
// swagger start
.
antMatchers
(
"/swagger-ui.html"
).
anonymous
()
.
antMatchers
(
"/swagger-resources/**"
).
anonymous
()
.
antMatchers
(
"/webjars/**"
).
anonymous
()
.
antMatchers
(
"/*/api-docs"
).
anonymous
()
// swagger end
.
antMatchers
(
HttpMethod
.
OPTIONS
,
"/**"
).
anonymous
()
// 所有请求都需要认证
.
anyRequest
().
authenticated
();
httpSecurity
.
addFilterBefore
(
authenticationTokenFilter
,
UsernamePasswordAuthenticationFilter
.
class
);
}
@Override
public
void
configure
(
WebSecurity
web
)
throws
Exception
{
// AuthenticationTokenFilter will ignore the below paths
web
.
ignoring
()
.
antMatchers
(
HttpMethod
.
POST
,
authenticationPath
)
// allow anonymous resource requests
.
and
()
.
ignoring
()
.
antMatchers
(
HttpMethod
.
GET
,
"/*.html"
,
"/**/*.html"
,
"/**/*.css"
,
"/**/*.js"
);
}
}
src/main/java/me/zhengjie/core/rest/AuthenticationController.java
0 → 100644
View file @
3d74dac9
package
me.zhengjie.core.rest
;
import
lombok.extern.slf4j.Slf4j
;
import
me.zhengjie.common.aop.log.Log
;
import
me.zhengjie.core.security.AuthenticationToken
;
import
me.zhengjie.core.security.AuthorizationUser
;
import
me.zhengjie.core.utils.JwtTokenUtil
;
import
me.zhengjie.core.security.JwtUser
;
import
me.zhengjie.core.utils.EncryptUtils
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.beans.factory.annotation.Qualifier
;
import
org.springframework.beans.factory.annotation.Value
;
import
org.springframework.http.ResponseEntity
;
import
org.springframework.security.authentication.AccountExpiredException
;
import
org.springframework.security.authentication.AuthenticationManager
;
import
org.springframework.security.core.userdetails.UserDetails
;
import
org.springframework.security.core.userdetails.UserDetailsService
;
import
org.springframework.web.bind.annotation.*
;
import
javax.servlet.http.HttpServletRequest
;
/**
* @author jie
* @date 2018-11-23
* 授权、根据token获取用户详细信息
*/
@Slf4j
@RestController
@RequestMapping
(
"auth"
)
public
class
AuthenticationController
{
@Value
(
"${jwt.header}"
)
private
String
tokenHeader
;
@Autowired
private
AuthenticationManager
authenticationManager
;
@Autowired
private
JwtTokenUtil
jwtTokenUtil
;
@Autowired
@Qualifier
(
"jwtUserDetailsService"
)
private
UserDetailsService
userDetailsService
;
/**
* 登录授权
* @param authorizationUser
* @return
*/
@Log
(
description
=
"用户登录"
)
@PostMapping
(
value
=
"${jwt.auth.path}"
)
public
ResponseEntity
<?>
authenticationLogin
(
@RequestBody
AuthorizationUser
authorizationUser
){
final
UserDetails
userDetails
=
userDetailsService
.
loadUserByUsername
(
authorizationUser
.
getUsername
());
if
(!
userDetails
.
getPassword
().
equals
(
EncryptUtils
.
encryptPassword
(
authorizationUser
.
getPassword
()))){
throw
new
AccountExpiredException
(
"密码错误"
);
}
if
(!
userDetails
.
isEnabled
()){
throw
new
AccountExpiredException
(
"账号已停用,请联系管理员"
);
}
// 生成令牌
final
String
token
=
jwtTokenUtil
.
generateToken
(
userDetails
);
// 返回 token
return
ResponseEntity
.
ok
(
new
AuthenticationToken
(
token
));
}
/**
* 获取用户信息
* @param request
* @return
*/
@GetMapping
(
value
=
"${jwt.auth.account}"
)
public
ResponseEntity
getUserInfo
(
HttpServletRequest
request
){
JwtUser
jwtUser
=
(
JwtUser
)
userDetailsService
.
loadUserByUsername
(
jwtTokenUtil
.
getUserName
(
request
));
return
ResponseEntity
.
ok
(
jwtUser
);
}
}
src/main/java/me/zhengjie/core/security/AuthenticationToken.java
0 → 100644
View file @
3d74dac9
package
me.zhengjie.core.security
;
import
lombok.AllArgsConstructor
;
import
lombok.Getter
;
import
java.io.Serializable
;
/**
* @author jie
* @date 2018-11-23
* 返回token
*/
@Getter
@AllArgsConstructor
public
class
AuthenticationToken
implements
Serializable
{
private
final
String
token
;
}
src/main/java/me/zhengjie/core/security/AuthorizationUser.java
0 → 100644
View file @
3d74dac9
package
me.zhengjie.core.security
;
import
lombok.Getter
;
import
lombok.Setter
;
import
javax.validation.constraints.NotBlank
;
/**
* @author jie
* @date 2018-11-30
*/
@Getter
@Setter
public
class
AuthorizationUser
{
@NotBlank
private
String
username
;
@NotBlank
private
String
password
;
@Override
public
String
toString
()
{
return
"{username="
+
username
+
", password= ******}"
;
}
}
src/main/java/me/zhengjie/core/security/JwtAuthenticationEntryPoint.java
0 → 100644
View file @
3d74dac9
package
me.zhengjie.core.security
;
import
org.springframework.security.core.AuthenticationException
;
import
org.springframework.security.web.AuthenticationEntryPoint
;
import
org.springframework.stereotype.Component
;
import
javax.servlet.http.HttpServletRequest
;
import
javax.servlet.http.HttpServletResponse
;
import
java.io.IOException
;
import
java.io.Serializable
;
@Component
public
class
JwtAuthenticationEntryPoint
implements
AuthenticationEntryPoint
,
Serializable
{
private
static
final
long
serialVersionUID
=
-
8970718410437077606L
;
@Override
public
void
commence
(
HttpServletRequest
request
,
HttpServletResponse
response
,
AuthenticationException
authException
)
throws
IOException
{
/**
* 当用户尝试访问安全的REST资源而不提供任何凭据时,将调用此方法发送401 响应
*/
response
.
sendError
(
HttpServletResponse
.
SC_UNAUTHORIZED
,
authException
==
null
?
"Unauthorized"
:
authException
.
getMessage
());
}
}
src/main/java/me/zhengjie/core/security/JwtAuthorizationTokenFilter.java
0 → 100644
View file @
3d74dac9
package
me.zhengjie.core.security
;
import
io.jsonwebtoken.ExpiredJwtException
;
import
me.zhengjie.core.utils.JwtTokenUtil
;
import
org.slf4j.Logger
;
import
org.slf4j.LoggerFactory
;
import
org.springframework.beans.factory.annotation.Qualifier
;
import
org.springframework.beans.factory.annotation.Value
;
import
org.springframework.security.authentication.UsernamePasswordAuthenticationToken
;
import
org.springframework.security.core.context.SecurityContextHolder
;
import
org.springframework.security.core.userdetails.UserDetails
;
import
org.springframework.security.core.userdetails.UserDetailsService
;
import
org.springframework.security.web.authentication.WebAuthenticationDetailsSource
;
import
org.springframework.stereotype.Component
;
import
org.springframework.web.filter.OncePerRequestFilter
;
import
javax.servlet.FilterChain
;
import
javax.servlet.ServletException
;
import
javax.servlet.http.HttpServletRequest
;
import
javax.servlet.http.HttpServletResponse
;
import
java.io.IOException
;
@Component
public
class
JwtAuthorizationTokenFilter
extends
OncePerRequestFilter
{
private
final
Logger
logger
=
LoggerFactory
.
getLogger
(
this
.
getClass
());
private
final
UserDetailsService
userDetailsService
;
private
final
JwtTokenUtil
jwtTokenUtil
;
private
final
String
tokenHeader
;
public
JwtAuthorizationTokenFilter
(
@Qualifier
(
"jwtUserDetailsService"
)
UserDetailsService
userDetailsService
,
JwtTokenUtil
jwtTokenUtil
,
@Value
(
"${jwt.header}"
)
String
tokenHeader
)
{
this
.
userDetailsService
=
userDetailsService
;
this
.
jwtTokenUtil
=
jwtTokenUtil
;
this
.
tokenHeader
=
tokenHeader
;
}
@Override
protected
void
doFilterInternal
(
HttpServletRequest
request
,
HttpServletResponse
response
,
FilterChain
chain
)
throws
ServletException
,
IOException
{
logger
.
debug
(
"processing authentication for '{}'"
,
request
.
getRequestURL
());
final
String
requestHeader
=
request
.
getHeader
(
this
.
tokenHeader
);
String
username
=
null
;
String
authToken
=
null
;
if
(
requestHeader
!=
null
&&
requestHeader
.
startsWith
(
"Bearer "
))
{
authToken
=
requestHeader
.
substring
(
7
);
try
{
username
=
jwtTokenUtil
.
getUsernameFromToken
(
authToken
);
}
catch
(
ExpiredJwtException
e
)
{
logger
.
error
(
e
.
getMessage
());
}
}
else
{
logger
.
warn
(
"couldn't find bearer string, will ignore the header"
);
}
logger
.
debug
(
"checking authentication for user '{}'"
,
username
);
if
(
username
!=
null
&&
SecurityContextHolder
.
getContext
().
getAuthentication
()
==
null
)
{
logger
.
debug
(
"security context was null, so authorizating user"
);
// It is not compelling necessary to load the use details from the database. You could also store the information
// in the token and read it from it. It's up to you ;)
UserDetails
userDetails
=
this
.
userDetailsService
.
loadUserByUsername
(
username
);
// For simple validation it is completely sufficient to just check the token integrity. You don't have to call
// the database compellingly. Again it's up to you ;)
if
(
jwtTokenUtil
.
validateToken
(
authToken
,
userDetails
))
{
UsernamePasswordAuthenticationToken
authentication
=
new
UsernamePasswordAuthenticationToken
(
userDetails
,
null
,
userDetails
.
getAuthorities
());
authentication
.
setDetails
(
new
WebAuthenticationDetailsSource
().
buildDetails
(
request
));
logger
.
info
(
"authorizated user '{}', setting security context"
,
username
);
SecurityContextHolder
.
getContext
().
setAuthentication
(
authentication
);
}
}
chain
.
doFilter
(
request
,
response
);
}
}
src/main/java/me/zhengjie/core/security/JwtUser.java
0 → 100644
View file @
3d74dac9
package
me.zhengjie.core.security
;
import
com.fasterxml.jackson.annotation.JsonIgnore
;
import
lombok.AllArgsConstructor
;
import
lombok.Getter
;
import
org.springframework.security.core.GrantedAuthority
;
import
org.springframework.security.core.userdetails.UserDetails
;
import
java.util.*
;
/**
* @author jie
* @date 2018-11-23
*/
@Getter
@AllArgsConstructor
public
class
JwtUser
implements
UserDetails
{
@JsonIgnore
private
final
Long
id
;
private
final
String
username
;
@JsonIgnore
private
final
String
password
;
private
final
String
avatar
;
private
final
String
email
;
@JsonIgnore
private
final
Collection
<?
extends
GrantedAuthority
>
authorities
;
private
final
boolean
enabled
;
@JsonIgnore
private
final
Date
lastPasswordResetDate
;
@JsonIgnore
@Override
public
boolean
isAccountNonExpired
()
{
return
true
;
}
@JsonIgnore
@Override
public
boolean
isAccountNonLocked
()
{
return
true
;
}
@JsonIgnore
@Override
public
boolean
isCredentialsNonExpired
()
{
return
true
;
}
@JsonIgnore
@Override
public
String
getPassword
()
{
return
password
;
}
@Override
public
boolean
isEnabled
()
{
return
enabled
;
}
/**
* 在我们保存权限的时候加上了前缀ROLE_,因此在这里需要处理下数据
* @return
*/
public
Collection
getRoles
()
{
Set
<
String
>
roles
=
new
LinkedHashSet
<>();
for
(
GrantedAuthority
authority
:
authorities
)
{
roles
.
add
(
authority
.
getAuthority
().
substring
(
5
));
}
return
roles
;
}
}
src/main/java/me/zhengjie/core/service/JwtUserDetailsService.java
0 → 100644
View file @
3d74dac9
package
me.zhengjie.core.service
;
import
me.zhengjie.common.exception.EntityNotFoundException
;
import
me.zhengjie.common.utils.ValidationUtil
;
import
me.zhengjie.core.security.JwtUser
;
import
me.zhengjie.system.domain.Permission
;
import
me.zhengjie.system.domain.Role
;
import
me.zhengjie.system.domain.User
;
import
me.zhengjie.system.repository.PermissionRepository
;
import
me.zhengjie.system.repository.UserRepository
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.cache.annotation.CacheConfig
;
import
org.springframework.cache.annotation.Cacheable
;
import
org.springframework.security.core.GrantedAuthority
;
import
org.springframework.security.core.authority.SimpleGrantedAuthority
;
import
org.springframework.security.core.userdetails.UserDetails
;
import
org.springframework.security.core.userdetails.UserDetailsService
;
import
org.springframework.stereotype.Service
;
import
org.springframework.transaction.annotation.Propagation
;
import
org.springframework.transaction.annotation.Transactional
;
import
java.util.ArrayList
;
import
java.util.HashSet
;
import
java.util.List
;
import
java.util.Set
;
import
java.util.stream.Collectors
;
/**
* @author jie
* @date 2018-11-22
*/
@Service
@Transactional
(
propagation
=
Propagation
.
SUPPORTS
,
readOnly
=
true
,
rollbackFor
=
Exception
.
class
)
public
class
JwtUserDetailsService
implements
UserDetailsService
{
@Autowired
private
UserRepository
userRepository
;
@Autowired
private
PermissionRepository
permissionRepository
;
@Override
public
UserDetails
loadUserByUsername
(
String
username
){
User
user
=
null
;
if
(
ValidationUtil
.
isEmail
(
username
)){
user
=
userRepository
.
findByEmail
(
username
);
}
else
{
user
=
userRepository
.
findByUsername
(
username
);
}
if
(
user
==
null
)
{
throw
new
EntityNotFoundException
(
User
.
class
,
"name"
,
username
);
}
else
{
return
create
(
user
);
}
}
public
UserDetails
create
(
User
user
)
{
return
new
JwtUser
(
user
.
getId
(),
user
.
getUsername
(),
user
.
getPassword
(),
user
.
getAvatar
(),
user
.
getEmail
(),
mapToGrantedAuthorities
(
user
.
getRoles
(),
permissionRepository
),
user
.
getEnabled
(),
user
.
getLastPasswordResetTime
()
);
}
private
static
List
<
GrantedAuthority
>
mapToGrantedAuthorities
(
Set
<
Role
>
roles
,
PermissionRepository
permissionRepository
)
{
Set
<
Permission
>
permissions
=
new
HashSet
<>();
for
(
Role
role
:
roles
)
{
Set
<
Role
>
roleSet
=
new
HashSet
<>();
roleSet
.
add
(
role
);
permissions
.
addAll
(
permissionRepository
.
findByRoles
(
roleSet
));
}
return
permissions
.
stream
()
.
map
(
permission
->
new
SimpleGrantedAuthority
(
"ROLE_"
+
permission
.
getName
()))
.
collect
(
Collectors
.
toList
());
}
}
src/main/java/me/zhengjie/core/utils/EncryptUtils.java
0 → 100644
View file @
3d74dac9
package
me.zhengjie.core.utils
;
import
org.springframework.util.DigestUtils
;
/**
* 加密
* @author jie
* @date 2018-11-23
*/
public
class
EncryptUtils
{
/**
* 密码加密
* @param password
* @return
*/
public
static
String
encryptPassword
(
String
password
){
return
DigestUtils
.
md5DigestAsHex
(
password
.
getBytes
());
}
public
static
void
main
(
String
[]
args
)
{
System
.
out
.
println
(
encryptPassword
(
"e10adc3949ba59abbe56e057f20f883e"
));
}
}
src/main/java/me/zhengjie/core/utils/JwtTokenUtil.java
0 → 100644
View file @
3d74dac9
package
me.zhengjie.core.utils
;
import
io.jsonwebtoken.*
;
import
io.jsonwebtoken.impl.DefaultClock
;
import
me.zhengjie.common.exception.BadRequestException
;
import
me.zhengjie.core.security.JwtUser
;
import
org.springframework.beans.factory.annotation.Value
;
import
org.springframework.http.ResponseEntity
;
import
org.springframework.security.authentication.AccountExpiredException
;
import
org.springframework.security.core.userdetails.UserDetails
;
import
org.springframework.stereotype.Component
;
import
org.springframework.util.StringUtils
;
import
javax.servlet.http.HttpServletRequest
;
import
java.io.Serializable
;
import
java.util.Date
;
import
java.util.HashMap
;
import
java.util.Map
;
import
java.util.function.Function
;
import
static
org
.
springframework
.
http
.
HttpStatus
.
UNAUTHORIZED
;
@Component
public
class
JwtTokenUtil
implements
Serializable
{
static
final
String
CLAIM_KEY_USERNAME
=
"sub"
;
static
final
String
CLAIM_KEY_CREATED
=
"iat"
;
private
static
final
long
serialVersionUID
=
-
3301605591108950415L
;
private
Clock
clock
=
DefaultClock
.
INSTANCE
;
@Value
(
"${jwt.secret}"
)
private
String
secret
;
@Value
(
"${jwt.expiration}"
)
private
Long
expiration
;
@Value
(
"${jwt.header}"
)
private
String
tokenHeader
;
public
String
getUsernameFromToken
(
String
token
)
{
return
getClaimFromToken
(
token
,
Claims:
:
getSubject
);
}
public
Date
getIssuedAtDateFromToken
(
String
token
)
{
return
getClaimFromToken
(
token
,
Claims:
:
getIssuedAt
);
}
public
Date
getExpirationDateFromToken
(
String
token
)
{
return
getClaimFromToken
(
token
,
Claims:
:
getExpiration
);
}
public
<
T
>
T
getClaimFromToken
(
String
token
,
Function
<
Claims
,
T
>
claimsResolver
)
{
final
Claims
claims
=
getAllClaimsFromToken
(
token
);
return
claimsResolver
.
apply
(
claims
);
}
private
Claims
getAllClaimsFromToken
(
String
token
)
{
return
Jwts
.
parser
()
.
setSigningKey
(
secret
)
.
parseClaimsJws
(
token
)
.
getBody
();
}
private
Boolean
isTokenExpired
(
String
token
)
{
final
Date
expiration
=
getExpirationDateFromToken
(
token
);
return
expiration
.
before
(
clock
.
now
());
}
private
Boolean
isCreatedBeforeLastPasswordReset
(
Date
created
,
Date
lastPasswordReset
)
{
return
(
lastPasswordReset
!=
null
&&
created
.
before
(
lastPasswordReset
));
}
private
Boolean
ignoreTokenExpiration
(
String
token
)
{
// here you specify tokens, for that the expiration is ignored
return
false
;
}
public
String
generateToken
(
UserDetails
userDetails
)
{
Map
<
String
,
Object
>
claims
=
new
HashMap
<>();
return
doGenerateToken
(
claims
,
userDetails
.
getUsername
());
}
private
String
doGenerateToken
(
Map
<
String
,
Object
>
claims
,
String
subject
)
{
final
Date
createdDate
=
clock
.
now
();
final
Date
expirationDate
=
calculateExpirationDate
(
createdDate
);
return
Jwts
.
builder
()
.
setClaims
(
claims
)
.
setSubject
(
subject
)
.
setIssuedAt
(
createdDate
)
.
setExpiration
(
expirationDate
)
.
signWith
(
SignatureAlgorithm
.
HS512
,
secret
)
.
compact
();
}
public
Boolean
canTokenBeRefreshed
(
String
token
,
Date
lastPasswordReset
)
{
final
Date
created
=
getIssuedAtDateFromToken
(
token
);
return
!
isCreatedBeforeLastPasswordReset
(
created
,
lastPasswordReset
)
&&
(!
isTokenExpired
(
token
)
||
ignoreTokenExpiration
(
token
));
}
public
String
refreshToken
(
String
token
)
{
final
Date
createdDate
=
clock
.
now
();
final
Date
expirationDate
=
calculateExpirationDate
(
createdDate
);
final
Claims
claims
=
getAllClaimsFromToken
(
token
);
claims
.
setIssuedAt
(
createdDate
);
claims
.
setExpiration
(
expirationDate
);
return
Jwts
.
builder
()
.
setClaims
(
claims
)
.
signWith
(
SignatureAlgorithm
.
HS512
,
secret
)
.
compact
();
}
public
Boolean
validateToken
(
String
token
,
UserDetails
userDetails
)
{
JwtUser
user
=
(
JwtUser
)
userDetails
;
final
String
username
=
getUsernameFromToken
(
token
);
final
Date
created
=
getIssuedAtDateFromToken
(
token
);
//final Date expiration = getExpirationDateFromToken(token);
return
(
username
.
equals
(
user
.
getUsername
())
&&
!
isTokenExpired
(
token
)
&&
!
isCreatedBeforeLastPasswordReset
(
created
,
user
.
getLastPasswordResetDate
())
);
}
public
String
getUserName
(
HttpServletRequest
request
){
String
authToken
=
request
.
getHeader
(
tokenHeader
);
if
(
StringUtils
.
isEmpty
(
authToken
)||
authToken
.
length
()<
7
){
throw
new
AccountExpiredException
(
"令牌已过期或无效"
);
}
final
String
token
=
authToken
.
substring
(
7
);
String
username
=
null
;
try
{
username
=
getUsernameFromToken
(
token
);
}
catch
(
ExpiredJwtException
e
){
throw
new
AccountExpiredException
(
"令牌已过期或无效"
);
}
if
(
StringUtils
.
isEmpty
(
username
)){
throw
new
AccountExpiredException
(
"令牌已过期或无效"
);
}
return
username
;
}
private
Date
calculateExpirationDate
(
Date
createdDate
)
{
return
new
Date
(
createdDate
.
getTime
()
+
expiration
);
}
}
src/main/java/me/zhengjie/monitor/domain/Logging.java
0 → 100644
View file @
3d74dac9
package
me.zhengjie.monitor.domain
;
import
lombok.Data
;
import
lombok.NoArgsConstructor
;
import
org.hibernate.annotations.CreationTimestamp
;
import
javax.persistence.*
;
import
java.sql.Timestamp
;
/**
* @author jie
* @date 2018-11-24
*/
@Entity
@Data
@Table
(
name
=
"log"
)
@NoArgsConstructor
public
class
Logging
{
@Id
@GeneratedValue
(
strategy
=
GenerationType
.
IDENTITY
)
private
Long
id
;
/**
* 操作用户
*/
private
String
username
;
/**
* 描述
*/
private
String
description
;
/**
* 方法名
*/
private
String
method
;
/**
* 参数
*/
private
String
params
;
/**
* 日志类型
*/
private
String
logType
;
/**
* 请求ip
*/
private
String
requestIp
;
/**
* 请求耗时
*/
private
Long
time
;
/**
* 异常详细
*/
private
String
exceptionDetail
;
/**
* 创建日期
*/
@CreationTimestamp
private
Timestamp
createTime
;
public
Logging
(
String
logType
,
Long
time
)
{
this
.
logType
=
logType
;
this
.
time
=
time
;
}
}
src/main/java/me/zhengjie/monitor/domain/Visits.java
0 → 100644
View file @
3d74dac9
package
me.zhengjie.monitor.domain
;
import
lombok.Data
;
import
org.hibernate.annotations.CreationTimestamp
;
import
javax.persistence.*
;
import
java.sql.Timestamp
;
/**
* pv 与 ip 统计
*
* @author jie
* @date 2018-12-13
*/
@Entity
@Data
@Table
(
name
=
"visits"
)
public
class
Visits
{
@Id
@GeneratedValue
(
strategy
=
GenerationType
.
IDENTITY
)
private
Long
id
;
private
String
date
;
@Column
(
name
=
"pv_counts"
)
private
Long
pvCounts
;
@Column
(
name
=
"ip_counts"
)
private
Long
ipCounts
;
@CreationTimestamp
private
Timestamp
createTime
;
private
String
weekDay
;
}
src/main/java/me/zhengjie/monitor/domain/vo/RedisVo.java
0 → 100644
View file @
3d74dac9
package
me.zhengjie.monitor.domain.vo
;
import
lombok.AllArgsConstructor
;
import
lombok.Data
;
import
lombok.NoArgsConstructor
;
import
javax.validation.constraints.NotBlank
;
/**
* @author jie
* @date 2018-12-10
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public
class
RedisVo
{
@NotBlank
private
String
key
;
@NotBlank
private
String
value
;
}
src/main/java/me/zhengjie/monitor/repository/LoggingRepository.java
0 → 100644
View file @
3d74dac9
package
me.zhengjie.monitor.repository
;
import
me.zhengjie.monitor.domain.Logging
;
import
org.springframework.data.jpa.repository.JpaRepository
;
import
org.springframework.data.jpa.repository.JpaSpecificationExecutor
;
import
org.springframework.data.jpa.repository.Query
;
import
org.springframework.stereotype.Repository
;
import
java.util.List
;
/**
* @author jie
* @date 2018-11-24
*/
@Repository
public
interface
LoggingRepository
extends
JpaRepository
<
Logging
,
Long
>,
JpaSpecificationExecutor
{
/**
* 获取一个时间段的IP记录
* @param date1
* @param date2
* @return
*/
@Query
(
value
=
"select count(*) FROM (select * FROM log where createTime between ?1 and ?2 GROUP BY requestIp) as s"
,
nativeQuery
=
true
)
Long
findIp
(
String
date1
,
String
date2
);
}
src/main/java/me/zhengjie/monitor/repository/VisitsRepository.java
0 → 100644
View file @
3d74dac9
package
me.zhengjie.monitor.repository
;
import
me.zhengjie.monitor.domain.Visits
;
import
org.springframework.data.jpa.repository.JpaRepository
;
import
org.springframework.data.jpa.repository.JpaSpecificationExecutor
;
import
org.springframework.data.jpa.repository.Query
;
import
org.springframework.stereotype.Repository
;
import
java.util.List
;
/**
* @author jie
* @date 2018-12-13
*/
@Repository
public
interface
VisitsRepository
extends
JpaRepository
<
Visits
,
Long
>
{
/**
* findByDate
* @param date
* @return
*/
Visits
findByDate
(
String
date
);
/**
* 获得一个时间段的记录
* @param date1
* @param date2
* @return
*/
@Query
(
value
=
"select * FROM visits where "
+
"createTime between ?1 and ?2"
,
nativeQuery
=
true
)
List
<
Visits
>
findAllVisits
(
String
date1
,
String
date2
);
}
Prev
1
2
3
4
5
Next
Write
Preview
Supports
Markdown
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