这个token的时间是设置的多少呢
在project Structure --> Modules -->对应项目的Sources栏目的 resouces文件指定到Resources下面即可扫描得到
用户进行认证去查询方法 jdbcRealm.setAuthenticationQuery(userSql);
用户进行角色授权去查询方法 jdbcRealm.setUserRolesQuery(roleSql);
等待启动完成
没有影响,用idea打出来就有,eclipse没有这个功能,就是提示作用,要不要无所谓的
navicate连接数据库就可以改啊,你那应该也可以改吧???、试试重命名
这么简单的SQL语句还要伸手?
user与role是n:n的关系,那么一定会有一张user_role中间表,存放user与role的对应关系。
你们谁有老师的数据库啊,能发一份?
需要的
好像是mysql的URL时区配置问题,URL后添加:
?serverTimezone=GMT%2B8
试试?
这个有一点点开发经验就可以自己写出来了,视频里的表的对应关系都有
-- auto-generated definition
CREATE TABLE users
(
id INT AUTO_INCREMENT
PRIMARY KEY,
username VARCHAR(64) NULL,
password VARCHAR(32) NULL
);
-- auto-generated definition
CREATE TABLE user_roles
(
id INT AUTO_INCREMENT
PRIMARY KEY,
username VARCHAR(64) NULL,
role_name VARCHAR(32) NULL
);
-- auto-generated definition
CREATE TABLE test_user_role
(
user_name VARCHAR(64) NULL,
role_name VARCHAR(32) NULL
);
-- auto-generated definition
CREATE TABLE test_user
(
id INT AUTO_INCREMENT
PRIMARY KEY,
username VARCHAR(64) NULL,
password VARCHAR(32) NULL
);
-- auto-generated definition
CREATE TABLE test_role_permissions
(
id INT AUTO_INCREMENT
PRIMARY KEY,
role_name VARCHAR(64) NULL,
permission VARCHAR(64) NULL
);
-- auto-generated definition
CREATE TABLE roles_permissions
(
id INT AUTO_INCREMENT
PRIMARY KEY,
role_name VARCHAR(32) NULL,
permission VARCHAR(64) NULL
);
你报的是什么错得先贴出来,单纯在数据库中加一个字段是不会影响到认证的!
有截图吗?啥都没有 咋给你看?
数据库格式与编辑器编码格式设为一致
CustomRealm:
public class CustomRealm extends AuthorizingRealm { Map<String, String> userMap = new HashMap<>(16); { userMap.put("Mark", "283538989cef48f3d7d8a1c1bdf2008f"); super.setName("customRealmName"); } // 授权 @Override protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) { String userName= (String) principals.getPrimaryPrincipal(); // 从数据库或者缓存中获取数据 Set<String> roles=getRolesByUserName(userName); Set<String> permission =getPermissionByUserName(userName); SimpleAuthorizationInfo simpleAuthorizationInfo=new SimpleAuthorizationInfo(); simpleAuthorizationInfo.setStringPermissions(permission); simpleAuthorizationInfo.setRoles(roles); return simpleAuthorizationInfo; } // 认证 @Override protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException { // 从主体传过来的用户信息中获得用户名 String userName = (String) token.getPrincipal(); // 通过用户名到数据库中获取凭证 String password = getPasswordByUserName(userName); if (password == null) { return null; } SimpleAuthenticationInfo authenticationInfo = new SimpleAuthenticationInfo("Mark",password,"customRealmName"); authenticationInfo.setCredentialsSalt(ByteSource.Util.bytes("Mark")); return authenticationInfo; } /*模拟数据库查询凭证*/ private String getPasswordByUserName(String userName) { return userMap.get(userName); } /*模拟数据库获取角色*/ private Set<String> getRolesByUserName(String userName) { Set<String> sets=new HashSet<>(); sets.add("admin"); sets.add("user"); return sets; } /*模拟数据库获取权限*/ private Set<String> getPermissionByUserName(String userName) { Set<String> sets=new HashSet<>(); sets.add("user:delete"); sets.add("user:add"); return sets; } // 计算加密之后的密文 public static void main(String[] args){ Md5Hash md5Hash=new Md5Hash("123456","Mark");//盐应为随机数,此处用“Mark”写死 System.out.println(md5Hash.toString());//通过控制台打印获得密文 } }
验证失败会有异常。加个异常处理
祝贺你,自己找到原因并解决,这是非常有成就感的一件事,而且也帮助自己更深理解问题所在,对于技术的提升也很有帮助
你表里user_name字段中有一个叫Mark的用户吗?
忽然看到了和你的差距:我的什么注释都没写,你的写的一清二楚,我的学习方法不对啊
你没有自己设置的话,jdbcRealm是会有默认的sql查询语句的,
看源码他是通过roleName来获取的,而不是username
已解决 是jar版本问题 原先是5.1.26 改成5.1.46 就好了
给你挨个试了一遍,可能性1:sql写错了。可能性2:jdbcRealm.setAuthenticationQuery(sql);没添加这句。
datasource.setUrl("jdbc:mysql://localhost:3306/test"); datasource.setUsername("root"); datasource.setPassword("1234"); 加一个驱动注册就行了 datasource.setDriverClassName("com.mysql.jdbc.Driver");
datasource.setUrl("jdbc:mysql://localhost:3306/test");
datasource.setUsername("root");
datasource.setPassword("1234");
加一个驱动注册就行了
datasource.setDriverClassName("com.mysql.jdbc.Driver");
然后建一个表就行了
这是建好的表
https://www.cnblogs.com/ljy-20180122/p/9157912.html