- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章解决springboot+shiro 权限拦截失效的问题由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
最近因为项目需要,接触了shiro。新手入门 。
发现权限拦截失效, 。
一直以为是以为授权和DB的问题 。
研究了一个下午,终于发现了问题所在 。
我的访问路径没有写前面的斜杠!!,而DB中的资源路径是可以省略的,崩溃了吧 。
但是问题来了,为什么在其他地方可以忽略掉前面的小斜杠呢?
经过几分钟的捣鼓发现,在springboot中,不论是thymeleaf的模板也好(我用的thymeleaf),还是后端代码也好,底层会自动补全这个斜杠 。
问题解决!! 。
补充知识:SpringBoot整合shiro的一个完整的小案例 。
SpringBoot整合配置版的shiro很简单,逻辑清 。
首先在pom.xml的配置如下,shiro使用缓存ehcache 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
<
dependency
>
<
groupId
>net.sf.ehcache</
groupId
>
<
artifactId
>ehcache</
artifactId
>
<
version
>2.10.4</
version
>
</
dependency
>
<!-- shiro spring. -->
<
dependency
>
<
groupId
>org.apache.shiro</
groupId
>
<
artifactId
>shiro-core</
artifactId
>
<
version
>1.2.2</
version
>
</
dependency
>
<
dependency
>
<
groupId
>org.apache.shiro</
groupId
>
<
artifactId
>shiro-spring</
artifactId
>
<
version
>1.2.2</
version
>
</
dependency
>
<!-- shiro ehcache -->
<
dependency
>
<
groupId
>org.apache.shiro</
groupId
>
<
artifactId
>shiro-ehcache</
artifactId
>
<
version
>1.2.2</
version
>
</
dependency
>
|
接着配置shiro 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
|
@Configuration
public
class
ShiroConfig {
@Bean
public
ShiroFilterFactoryBean shirFilter(DefaultWebSecurityManager securityManager) {
ShiroFilterFactoryBean shiroFilter =
new
ShiroFilterFactoryBean();
// 必须设置 SecurityManager
shiroFilter.setSecurityManager(securityManager);
// 拦截器
Map<String, String> filterChainDefinitionMap =
new
LinkedHashMap<String, String>();
// 设置login URL
shiroFilter.setLoginUrl(
"/login"
);
// 登录成功后要跳转的链接
shiroFilter.setSuccessUrl(
"/main"
);
filterChainDefinitionMap.put(
"/webjars/**"
,
"anon"
);
filterChainDefinitionMap.put(
"/druid/**"
,
"anon"
);
//静态资源的处理
filterChainDefinitionMap.put(
"/js/**"
,
"anon"
);
filterChainDefinitionMap.put(
"/css/**"
,
"anon"
);
filterChainDefinitionMap.put(
"/asserts/**"
,
"anon"
);
filterChainDefinitionMap.put(
"/fonts/**"
,
"anon"
);
filterChainDefinitionMap.put(
"/images/**"
,
"anon"
);
// 退出系统的过滤器
filterChainDefinitionMap.put(
"/logout"
,
"logout"
);
filterChainDefinitionMap.put(
"/login"
,
"anon"
);
filterChainDefinitionMap.put(
"/kaptcha"
,
"anon"
);
filterChainDefinitionMap.put(
"/**"
,
"authc"
);
shiroFilter.setFilterChainDefinitionMap(filterChainDefinitionMap);
return
shiroFilter;
}
@Bean
public
HashedCredentialsMatcher hashedCredentialsMatcher() {
HashedCredentialsMatcher hashedCredentialsMatcher =
new
HashedCredentialsMatcher();
hashedCredentialsMatcher.setHashAlgorithmName(
"MD5"
);
hashedCredentialsMatcher.setHashIterations(
1024
);
return
hashedCredentialsMatcher;
}
@Bean
public
ShiroRealm shiroRealm(HashedCredentialsMatcher hashedCredentialsMatcher) {
ShiroRealm shiroRealm =
new
ShiroRealm();
shiroRealm.setCredentialsMatcher(hashedCredentialsMatcher);
return
shiroRealm;
}
//shiro使用缓存ehcachae
@Bean
public
EhCacheManager ehCacheManager() {
EhCacheManager ehCacheManager =
new
EhCacheManager();
ehCacheManager.setCacheManagerConfigFile(
"classpath:ehcache.xml"
);
return
ehCacheManager;
}
@Bean
(
"sessionManager"
)
public
SessionManager sessionManager(){
DefaultWebSessionManager sessionManager =
new
DefaultWebSessionManager();
sessionManager.setSessionValidationSchedulerEnabled(
true
);
sessionManager.setSessionIdCookieEnabled(
true
);
return
sessionManager;
}
@Bean
(
"securityManager"
)
public
DefaultWebSecurityManager securityManager(ShiroRealm shiroRealm, SessionManager sessionManager) {
DefaultWebSecurityManager securityManager =
new
DefaultWebSecurityManager();
securityManager.setRealm(shiroRealm);
securityManager.setSessionManager(sessionManager);
return
securityManager;
}
@Bean
(
"lifecycleBeanPostProcessor"
)
public
LifecycleBeanPostProcessor lifecycleBeanPostProcessor() {
return
new
LifecycleBeanPostProcessor();
}
@Bean
public
DefaultAdvisorAutoProxyCreator defaultAdvisorAutoProxyCreator() {
DefaultAdvisorAutoProxyCreator proxyCreator =
new
DefaultAdvisorAutoProxyCreator();
proxyCreator.setProxyTargetClass(
true
);
return
proxyCreator;
}
@Bean
public
AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor(SecurityManager securityManager) {
AuthorizationAttributeSourceAdvisor advisor =
new
AuthorizationAttributeSourceAdvisor();
advisor.setSecurityManager(securityManager);
return
advisor;
}
}
|
在配置中提到的realm如下配置 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
|
public
class
ShiroRealm
extends
AuthorizingRealm {
@Autowired
private
UserService userService;
@Override
protected
AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token)
throws
AuthenticationException {
UsernamePasswordToken upToken = (UsernamePasswordToken) token;
// 取出表单用户名
String username = upToken.getUsername();
// 查询是否有该用户
if
(userService.getByName(username) ==
null
) {
throw
new
UnknownAccountException(
"用户不存在!"
);
}
// 靠用户名从数据库查询该用户的全部信息
User user = userService.getByName(username);
// 传入:用户名,加密后的密码,盐值,该realm的名字,加密算法和加密次数在已经在配置文件中指定
SimpleAuthenticationInfo info =
new
SimpleAuthenticationInfo(username, user.getPassword(),
ByteSource.Util.bytes(username), getName());
return
info;
}
@Override
protected
AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
// 1. 从 PrincipalCollection 中来获取登录用户的信息
Object principal = principals.getPrimaryPrincipal();
// 2. 利用登录的用户的信息来..当前用户的角色或权限(可能需要查询数据库)
Set<String> roles =
new
HashSet<String>();
roles.add(
"user"
);
if
(
"admin"
.equals(principal)) {
roles.add(
"admin"
);
}
// 3. 创建 SimpleAuthorizationInfo, 并设置其 reles 属性
SimpleAuthorizationInfo info =
new
SimpleAuthorizationInfo(roles);
// 4. 返回 SimpleAuthorizationInfo 对象.
return
info;
}
}
|
由于我做的平台只有一个管理员就不写注册了,这时手动算出一个admin用户的密码 。
1
2
3
4
5
|
public
static
void
main(String[] args) {
Object result =
new
SimpleHash(
"MD5"
,
"123456"
,ByteSource.Util.bytes(
"admin"
),
1024
);
System.out.println(result);
}
|
最后写登录的Controller 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
|
@Controller
public
class
LoginController {
// 处理登录逻辑
@PostMapping
(
"/login"
)
public
String login(String username, String password, String kaptcha, HttpSession session,
Map<String, Object> map) {
Subject currentUser = SecurityUtils.getSubject();
if
(!currentUser.isAuthenticated()) {
// 把用户名和密码封装为 UsernamePasswordToken 对象
UsernamePasswordToken token =
new
UsernamePasswordToken(username, password);
// 设置为rememberme
token.setRememberMe(
true
);
try
{
// 执行登录.
currentUser.login(token);
}
// 所有认证时异常的父类
catch
(AuthenticationException ae) {
map.put(
"password"
,
"输入的用户名或密码错误"
);
log.info(
"登录失败: "
+ ae.getMessage());
return
"login"
;
}
}
if
(!session.getAttribute(
"code"
).equals(kaptcha)) {
map.put(
"kaptcha"
,
"输入的验证码错误"
);
return
"login"
;
}
session.setAttribute(
"loginUser"
,
"user"
);
return
"main"
;
}
}
|
以上这篇解决springboot+shiro 权限拦截失效的问题就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我.
原文链接:https://blog.csdn.net/qq_41247335/article/details/105319266 。
最后此篇关于解决springboot+shiro 权限拦截失效的问题的文章就讲到这里了,如果你想了解更多关于解决springboot+shiro 权限拦截失效的问题的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我已经一遍又一遍地讨论如何让用户登录 Shiro,但似乎仍然缺少一个重要的部分:shiro 如何根据存储的用户名和密码验证给定的用户名和密码?我想到的最多的是 It is each Realm's r
Apache Shiro 文档暗示了一些用于捕获连续失败登录尝试(以及其他)的所需功能,但是,我找不到具体的文档。目前我可以执行 currentUser.login(token);使用无效密码无限次并
我想在下一个Web项目中使用Shiro,但是我不知道一种好的(如果不是最好的)策略来管理用户(shiro.ini中的[users])。 最好为每个注册成员创建Shiro用户吗? 还是创建一个Shiro
我有一个简单的网络项目。我想在这个项目中访问多个角色是一个 URL。 网址的 sihor.ini 部分 [urls] /login.xhtml = authc /logout = logout /ad
我正在使用 apache shiro。当我想知道用户是否有权限和角色时,我使用 SecutiryUtils.getSubject()。我想知道如何向主题添加更多信息,例如电子邮件、主键和我需要的任何其
1、Shiro认证过程 1、收集实体/凭据信息 复制代码 代码如下: //Example using most common scenario of usern
我正在尝试使用 Shiro 对 Tomcat 6 中运行的 servlet 进行身份验证。 我有以下 shiro.ini 文件: [main] ps = org.apache.shiro.authc.
Apache Shiro的配置主要分为四部分: 对象和属性的定义与配置 URL的过滤器配置 静态用户配置 静态角色配置 其中,由于用户、角色一般由后台进行操作的动态数据,因此Shiro配置一般仅包
我正在使用 Spring MVC、Tiles 和 Shiro。 这是我的未授权Url 属性的配置方式: 我的期望是,当 MyAuthorizingRealm发现无效凭据,Shiro 将重定向到 /un
我正在使用 Apache Shiro 开发基于 EJB 的网络服务来管理用户访问权限。我添加了 freshly released我的 Maven 项目的 Apache Shiro 1.5.0 版使用新
我正在将现有应用程序从Grails 2.4.4升级到Grails 3.2.8。我正在尝试从grails shiro插件迁移到grails spring-security-shiro插件。除了访问已登录
我正在将我的应用程序从grails 2.4.4迁移到grails 3.2.9。 我正在尝试迁移到 compile 'org.grails.plugins:spring-security-shiro:3
在我包含 shiro-core-1.2.2 和 shiro-web-1.2.2 之前,我的 Maven Web 项目工作正常但是当我在 pom.xml 中包含此依赖项之后,我在执行时收到错误mvn t
我将 Apache Shiro 与 Spring 一起使用,并且仅使用 Spring 的 Java 配置。 (没有 XML)。下面是我的配置类的一部分: @Configuration public c
我能够使用 shiro.ini 和 spring 运行 shiro,但我想使用 shiro 注释,所以我尝试在没有 ini 文件的情况下使用 shiro-spring。但这让我很难受错误: org.a
1. 权限管理 1.1 什么是权限管理? 权限管理实现对用户访问系统的控制,按照安全规则或者安全策略,可以控制用户只能访问自己被授权的资源 权限管理包括用户身份认证和授权两部分,简称认证授权 1.2
我们经常会有用到,当A 用户在北京登录 ,然后A用户在天津再登录 ,要踢出北京登录的状态。如果用户在北京重新登录,那么又要踢出天津的用户,这样反复。 这样保证了一个帐号只能同时一个人使用。那么下面
有没有办法在 Shiro 中实现多因素身份验证?有人可以给我一个关于如何实现这一点的提示吗? 更多细节: 基本思想是,用户需要像往常一样使用用户名和密码登录,但在实际验证之前,用户还需要输入他作为 S
ini 文件就像 [main] authc.loginUrl = /login.html authc.successUrl = /index.html authc.usernameParam = j_
我了解 spring jsf 和 hibernate。我已经整合了它们并创建了我自己的框架。现在我想使用 Apache Shiro 将 session 管理添加到我的框架中。但我对 Apache Sh
我是一名优秀的程序员,十分优秀!