权限管理
经典权限五张表
用户管理(为用户分配角色)
查询cms管理员列表
- cms_manager(系统用户表,id是自增那种,不是mysql的自增,是1,2,3,4这种,每次新增都降序取第一个id,然后加1)
- 根据姓名和用户名称查询,条件是没有被删除的,核心字段is_delete
- 新增,涉及密码加密
- 分配角色,
- 系统角色表(cms_role),核心字段:name(角色名称),description(角色描述)
角色有:超级管理员, - 系统用户角色关联表(cms_manager_role),
核心字段:manager_id(系统用户id),role_id(角色id)
3.角色管理 - 分配权限,role_permission(系统角色权限关联表)
核心字段:role_id(角色ID),permission_id(权限ID)
- 菜单管理(权限管理)
cms_permission(系统权限表),
核心字段:name(权限名称),description(权限描述),url(权限页面(url),springmvc的请求的全路径)
springSecurity密码加密解密工具类
package com.aihangyun.cms.util;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.DelegatingPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.security.crypto.password.Pbkdf2PasswordEncoder;
import org.springframework.security.crypto.scrypt.SCryptPasswordEncoder;
import java.util.HashMap;
import java.util.Map;
public class EncryptUtil {
// 从配置文件中获得
private static final PasswordEncoder encoder = DefaultPasswordEncoderFactories.createDelegatingPasswordEncoder();
// 加密方法
public static String encrypt(String rawPassword) {
return encoder.encode(rawPassword);
}
// 解密方法
public static boolean match(String rawPassword, String password) {
return encoder.matches(rawPassword, password);
}
private static class DefaultPasswordEncoderFactories {
// java注解,不检测过期的方法
@SuppressWarnings("deprecation")
static PasswordEncoder createDelegatingPasswordEncoder() {
String encodingId = "MD5";
// 代码 encoders 的 Map 包含了很多种密码编码器,有 ldap 、MD4 、 MD5 、noop 、pbkdf2 、scrypt 、SHA-1 、SHA-256
Map<String, PasswordEncoder> encoders = new HashMap<>();
// 静态工厂方法可以看出,默认是创建并返回一个 BCryptPasswordEncoder,
// 同时该 BCryptPasswordEncoder( PasswordEncoder 子类)也是 Spring Security 推荐的默认密码编码器,其中 noop 就是不做处理默认保存原密码。
// 一般我们代码中 @Autowired 注入并使用 PasswordEncoder 接口的实例,
// 然后调用其 matches 方法去匹配原密码和数据库中保存的“密码”;密码的校验方式有多种,从 PasswordEncoder 接口实现的类是可以知道。
encoders.put(encodingId, new BCryptPasswordEncoder());
encoders.put("ldap", new org.springframework.security.crypto.password.LdapShaPasswordEncoder());
encoders.put("MD4", new org.springframework.security.crypto.password.Md4PasswordEncoder());
encoders.put("MD5", new org.springframework.security.crypto.password.MessageDigestPasswordEncoder("MD5"));
encoders.put("noop", org.springframework.security.crypto.password.NoOpPasswordEncoder.getInstance());
encoders.put("pbkdf2", new Pbkdf2PasswordEncoder());
encoders.put("scrypt", new SCryptPasswordEncoder());
encoders.put("bcrypt", new BCryptPasswordEncoder());
encoders.put("SHA-1",
new org.springframework.security.crypto.password.MessageDigestPasswordEncoder("SHA-1"));
encoders.put("SHA-256",
new org.springframework.security.crypto.password.MessageDigestPasswordEncoder("SHA-256"));
encoders.put("sha256", new org.springframework.security.crypto.password.StandardPasswordEncoder());
return new DelegatingPasswordEncoder(encodingId, encoders);
}
}
}
角色管理(为用户分配权限)
权限管理(菜单管理,到达每个页面的url)
yml文件
server:
port: 8081
tomcat:
#最大工作线程数,默认200, 4核8g内存,线程数经验值800
#操作系统做线程之间的切换调度是有系统开销的,所以不是越多越好。
max-threads: 600 # Maximum amount of worker threads.
# 最小工作空闲线程数,默认10, 适当增大一些,以便应对突然增长的访问量
min-spare-threads: 100 # Minimum amount of worker threads.
# 官方文档的说明为:当所有的请求处理线程都在使用时,所能接收的连接请求的队列的最大长度。
# 当队列已满时,任何的连接请求都将被拒绝。accept-count的默认值为100。
# 详细的来说:当调用HTTP请求数达到tomcat的最大线程数时,还有新的HTTP请求到来,
# 这时tomcat会将该请求放在等待队列中,这个acceptCount就是指能够接受的最大等待数,默认100。
# 如果等待队列也被放满了,这个时候再来新的请求就会被tomcat拒绝(connection refused)。
accept-count: 700
# 前端页面表单输入数据较多,包含多个文本、多张图片,在数据未压缩的情况下,最终上传失败。
# 即:请求数据量过大,超出了最大阈值。
# max-http-post-size: -1
spring:
application:
name: info-cms
profiles:
active: ${environment}
include:
security:
user:
name: jason
password: jason
datasource:
# springBoot默认数据源
type: com.zaxxer.hikari.HikariDataSource
# url: jdbc:mysql://${DB_HOST}:${DB_PORT:3306}/info?useUnicode=true&characterEncoding=utf-8
# driver-class-name: com.mysql.jdbc.Driver
# username: ${DB_USERNAME}
# password: ${DB_PASSWORD}
# url: jdbc:mysql://${DB_HOST:172.19.134.132}:${DB_PORT:4006}/info?useUnicode=true&characterEncoding=utf-8
# driver-class-name: com.mysql.jdbc.Driver
# username: ${DB_USERNAME:test}
# password: ${DB_PASSWORD:aiHungG#$%687}
# url: jdbc:mysql://${DB_HOST:test.aihangcloud.cn}:${DB_PORT:3306}/info?useUnicode=true&characterEncoding=utf-8
# driver-class-name: com.mysql.jdbc.Driver
# username: ${DB_USERNAME:test}
# password: ${DB_PASSWORD:test}
# url: jdbc:mysql://${DB_HOST:db2.aihangxunxi.com}:${DB_PORT:3306}/info?useUnicode=true&characterEncoding=utf-8
# driver-class-name: com.mysql.jdbc.Driver
# username: ${DB_USERNAME:test}
# password: ${DB_PASSWORD:aiHungG#$%687}
# url: jdbc:mysql://test.aihangcloud.cn:3306/info?useUnicode=true&characterEncoding=utf-8
# driver-class-name: com.mysql.jdbc.Driver
# username: test
# password: test
url: ${info.db.jdbc.url}
driver-class-name: org.mariadb.jdbc.Driver
username: ${info.db.jdbc.username}
password: ${info.db.jdbc.password}
hikari:
maxLifetime: 1765000 #一个连接的生命时长(毫秒),超时而且没被使用则被释放(retired),缺省:30分钟,建议设置比数据库超时时长少30秒以上
maximumPoolSize: 15 #连接池中允许的最大连接数。缺省值:10;推荐的公式:((core_count * 2) + effective_spindle_count)
# 用户登录设备后如果长时间没有进行操作,将一直占用此用户界面,造成资源的浪费,可以配置此命令将长时间连接始终处于空闲状态,系统将自动断开该连接。
# 缺省情况下,用户连接的超时时间是10分钟;通常情况下,推荐设置用户界面断连的超时时间在10~15分钟之间,具体情况视情况而定。
idle-timeout: 100000
connection-init-sql: SET NAMES utf8mb4 COLLATE utf8mb4_unicode_ci;
data:
mongodb:
uri: ${info.mongo.uri}
username:
password:
redis:
database: 0
host: ${info.auth.redis.host}
port: ${info.auth.redis.port}
password:
#banner
banner:
location: banner-girl.txt
#freemarker
freemarker:
cache: false
charset: utf-8
suffix: .ftl
template-loader-path: classpath:/templates/
settings:
# auto_import正确批量加载freemarker宏定义的方法
# 前几天自己写freemarker的宏的时候,总是加载不上宏标签
# https://my.oschina.net/Tonyjingzhou/blog/510026
# 不太懂,有时间研究研究
auto_import: /spring.ftl as spring
#servlet配置
servlet:
multipart:
# 支持多文件上传
enabled: true
# 有时间研究这个参数
file-size-threshold: 0
max-file-size: 5MB
max-request-size: 10MB
# https://www.cnblogs.com/cyh706510441/p/8855320.html
# dzh,有时间研究
resolve-lazily: false
#国际化i18n
messages:
basename: i18n/messages
encoding: UTF-8
jackson:
date-format: yyyy-MM-dd HH:mm:ss
time-zone: GMT+8
#mybatis
mybatis:
#pojo别名扫描包
type-aliases-package: com.aihangyun.cms.domain
type-handlers-package: com.aihangyun.cms.common.enums.handler
##eureka
#eureka:
# client:
# serviceUrl:
# defaultZone: http://localhost:8761/eureka/
logging:
# config: classpath:config/log4j2-dev.xml
level:
com.aihangyun.cms.repository: debug
# 自定义变量
## File Storage Properties
file:
upload-dir: './uploads'
chat:
host: dev.aihangcloud.cn
login: http://dev.aihangcloud.cn:8092/user/login
push: http://dev.aihangcloud.cn:8092/tigase/push2users
ip: 172.19.26.7
#chat:
# host: dev.aihangcloud.cn
# login: http://192.168.100.224:8092/user/login
# push: http://192.168.100.224:8092/tigase/push2users
# ip: 172.19.26.7
sms: # 短信验证码
aliyun:
accessKeyId: LTAIHhiyEU6dgRNT
accessKeySecret: YNxfEbW5BilcoiHrbAWhdjL89FKYmw
code-timeout: 60000
domain: dysmsapi.aliyuncs.com # 产品名称:云通信短信API产品,开发者无需替换
product: Dysmsapi
redis-namespace: 'sms:key:' # 自定义redis命名空间
#广告 info-ad
#收藏 info-favortite
#关注 info-follow
#浏览记录 info-history
#广告关键字 ad-lable
es:
host: ${info.elasticsearch.host}
port: 9200
scheme: http
infoAd: info-ad
info:
app:
domain: localhost:8082
从来没把老师当成男性。从不知道老师把她当成女性。
房思琪的初恋乐园
刘奕含