現象描述:做了一個簡單的登錄頁面,用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="https://bbs.csdn.net/jsp/login.jsp" />
<!-- 配置我們在登錄頁登錄成功后的跳轉地址,如果你訪問的是非/login地址,則跳到您訪問的地址 -->
<property name="successUrl" value="https://bbs.csdn.net/jsp/index.jsp" />
<!-- 如果您請求的資源不再您的權限范圍,則跳轉到/403請求地址 -->
<property name="unauthorizedUrl" value="https://bbs.csdn.net/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="https://bbs.csdn.net/topics/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="https://bbs.csdn.net/topics/登錄"/>
</form>
</body>
</html>
現象:
在login.jsp頁面登錄,頁面沒有反應,關鍵是程式沒有報錯,控制臺沒有任何列印(由此判斷沒有進入myrealm的認證方法),大家能不能幫忙看看,哪里有問題呢?
uj5u.com熱心網友回復:
<!-- 權限配置 --><property name="filterChainDefinitions">
<value>
<!-- anon表示此地址不需要任何權限即可訪問 -->
login_*=anon
這配置有問題把?
/login_*=anon 這樣的把
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/72951.html
標籤:Java EE
上一篇:注冊資訊輸入到mysql 但是出現了Unable to compile class for JSP:
下一篇:小白請教引數賦值問題
