ssh框架整合shiro, shiro不执行myrealm的认证方法

weixin_43707266 2020-05-10 02:02:19
现象描述:做了一个简单的登录页面,用shiro。
登录页面:login.jsp, 登录成功:index.jsp。

配置如下:
applicationContext-shiro.xml
<!--3. 配置自定义realm-->
<bean id="myRealm" class="tester.shiro.MyRealm">
<property name="loginService" ref="loginService"></property>
</bean>

<!-- 配置权限管理器 -->
<bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
<!-- ref对应我们写的realm MyRealm -->
<property name="realm" ref="myRealm" />
<!-- 使用下面配置的缓存管理器 -->
<property name="cacheManager" ref="cacheManager" />
</bean>

<!-- 配置shiro的过滤器工厂类,id- shiroFilter要和我们在web.xml中配置的过滤器一致 -->
<bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
<!-- 调用我们配置的权限管理器 -->
<property name="securityManager" ref="securityManager" />
<!-- 配置我们的登录请求地址,跳转到登录页面 -->
<property name="loginUrl" value="/jsp/login.jsp" />
<!-- 配置我们在登录页登录成功后的跳转地址,如果你访问的是非/login地址,则跳到您访问的地址 -->
<property name="successUrl" value="/jsp/index.jsp" />
<!-- 如果您请求的资源不再您的权限范围,则跳转到/403请求地址 -->
<property name="unauthorizedUrl" value="/jsp/403.jsp" />

<!-- 权限配置 -->
<property name="filterChainDefinitions">
<value>
<!-- anon表示此地址不需要任何权限即可访问 -->
login_*=anon
/jsp/register.jsp=anon
/jsp/login.jsp=anon

<!-- authc表示认证后可以访问 -->
/jsp/index.jsp=authc

<!-- perms[user:query]表示访问此连接需要权限为user:query的用户 -->
<!-- /user/touser.action=perms[user:query] -->

<!-- roles[manager]表示访问此连接需要用户的角色为manager -->
<!-- /user/del/**=roles[admin]
/toPrivilege.action=roles[admin] -->
<!-- /system/user/**= roles[admin,HR]
/system/** = roles[admin,HR] -->

<!--所有的请求(除去配置的静态资源请求或请求地址为anon的请求)都要通过登录验证,如果未登录则跳到/login -->
/** = authc

</value>
</property>
</bean>




<bean id="cacheManager" class="org.apache.shiro.cache.MemoryConstrainedCacheManager" />
<bean id="lifecycleBeanPostProcessor" class="org.apache.shiro.spring.LifecycleBeanPostProcessor" />

<!-- AOP式方法级权限检查 -->
<bean class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator"
depends-on="lifecycleBeanPostProcessor">
<property name="proxyTargetClass" value="true" />
</bean>

<bean class="org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor">
<property name="securityManager" ref="securityManager" />
</bean>

myrealm类实现如下:
@Component
@Transactional
public class MyRealm extends AuthorizingRealm {

private LoginService loginService;

//授权信息(doGetAuthorizationInfo)
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals)
{
System.out.println("授权信息......");
//从principals中获取登陆用户输入的登录名
String loginname = (String) principals.fromRealm(getName()).iterator().next();//用迭代器
//从数据库判断用户是否存在
User user = loginService.findUserByName(loginname);
if(user != null)
{
SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();
Set<Role> roles = user.getRoles();
for (Role role : roles)
{
//把角色的名字添加到授权信息中
info.addRole(role.getRole_name());
//获取角色的对应权限
Set<Permission> permissions = role.getPermissions();
for (Permission permission : permissions)
{
info.addStringPermission(permission.getValidateurl());
}
}
return info;
}
return null;
}


//获取身份验证信息(doGetAuthenticationInfo
@Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException
{
System.out.println("验证信息......");
// 转换成为更简单的UsernamePasswordToken对象
UsernamePasswordToken usertoken = (UsernamePasswordToken) token;
User user = loginService.findUserByName(usertoken.getUsername());
if(user != null)
{
SimpleAuthenticationInfo info = new SimpleAuthenticationInfo(user.getUsername(),usertoken.getPassword(),getName());
return info;
}
return null;
}

public LoginService getLoginService() {
return loginService;
}

public void setLoginService(LoginService loginService) {
this.loginService = loginService;
}

}

login.jsp:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>登录页面</title>
</head>
<body>
<form action="${pageContext.request.contextPath }/login_login" method=post >

<label>请输入账号:</label> <input type="text" name="user.username" />
<label>请输入密码:</label> <input type="password" name="user.password" />

<input type="submit" value="登录"/>
</form>

</body>
</html>

现象:
在login.jsp页面登录,页面没有反应,关键是程序没有报错,控制台没有任何打印(由此判断没有进入myrealm的认证方法),大家能不能帮忙看看,哪里有问题呢?
...全文
143 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
dkwuxiang 2020-05-11
  • 打赏
  • 举报
回复
<!-- 权限配置 --> <property name="filterChainDefinitions"> <value> <!-- anon表示此地址不需要任何权限即可访问 --> login_*=anon 这配置有问题把? /login_*=anon 这样的把

67,513

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧