1. 程式人生 > >Apache Shiro 身份認證例子

Apache Shiro 身份認證例子

1. 概述

在本例子中使用Apache ShiroWeb應用中實現身份認證,將ShiroSpring進行整合,使用內嵌的derby資料庫儲存使用者資訊。

持久層為Hibernate,資料庫連線池為alibaba druid。

2. 準備

建立一個內嵌的derby資料庫,本例使用的是db-derby-10.10.1.1

2.1 建表

Create table users(

Id int primary key,

Name varchar(20),

Passwd varchar(20)

);

2.2 初始化資料

Insert into users values(1,’admin’,’admin’);

Insert into users values(2,’peter’,’peter’);

3. 配置

3.1 Web.xml

<!-- Apache Shiro -->
<filter>
<filter-name>shiroFilter</filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
<init-param>
<param-name>targetFilterLifecycle</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>shiroFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

3.2 ApplicationContext.xml

<!-- 安全認證過濾器 -->
	<bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
		<property name="securityManager" ref="securityManager" />
		<property name="loginUrl" value="/index.do" />
		
		<property name="filterChainDefinitions">
			<value>
				/login.do = anon
				/** = authc

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

	<!-- 定義 Shiro 主要業務物件 -->
	<bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
		<property name="realm" ref="systemAuthorizingRealm" />
	</bean>

	<!-- 保證實現了Shiro內部lifecycle函式的bean執行 -->
	<bean id="lifecycleBeanPostProcessor" class="org.apache.shiro.spring.LifecycleBeanPostProcessor" />


4. 認證

登入JSP
<%@ page language="java" contentType="text/html; charset=UTF-8"
	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>Login</title>
</head>
<body>
	<form id="form1" name="form1" method="post" action="login.do">
		<p align="center">使用者登入</p>
		<table width="296" border="1" align="center" bgcolor="#00FF99">
			<tr>
				<td width="98" height="34">使用者名稱:</td>
				<td width="182"><label><input name="loginName"
						type="text" id="loginName" /> </label></td>
			</tr>

			<tr>
				<td height="36">密碼:</td>
				<td><label> <input name="password" type="password"
						id="password" />
				</label></td>
			</tr>
			<tr>
				<td height="35" colspan="2"><label>      
						<input type="submit" name="Submit" value="提交" />
				</label> <label>       <input
						type="reset" name="Submit2" value="重置" />
				</label></td>
			</tr>
		</table>
	</form>
</body>
</html>

Web控制器
@Controller
public class LoginController {
	private static final Logger LOGGER = LoggerFactory.getLogger(LoginController.class);

	@RequestMapping(value = "/login.do", method = RequestMethod.POST)
	public String isLogin(HttpServletRequest request, PasswordAuthcInfo passwordAuthcInfo) {
		String loginName = passwordAuthcInfo.getLoginName();
		String loginPassword = passwordAuthcInfo.getPassword();
		LOGGER.info("loginName:" + loginName + ";loginPassword:" + loginPassword);

		HttpSession session = request.getSession(true);
		String errorMessage = "";

		Subject user = SecurityUtils.getSubject();

		UsernamePasswordToken token = new UsernamePasswordToken(loginName, loginPassword);
		token.setRememberMe(true);

		try {
			user.login(token);
			String userID = (String) user.getPrincipal();
			LOGGER.info("User [" + userID + "] logged in successfully.");

			session.setAttribute("USERNAME", userID);
			return "success";
		} catch (UnknownAccountException uae) {
			errorMessage = "使用者認證失敗:" + "username wasn't in the system.";
			LOGGER.info(errorMessage);
		} catch (IncorrectCredentialsException ice) {
			errorMessage = "使用者認證失敗:" + "password didn't match.";
			LOGGER.info(errorMessage);
		} catch (LockedAccountException lae) {
			errorMessage = "使用者認證失敗:" + "account for that username is locked - can't login.";
			LOGGER.info(errorMessage);
		} catch (AuthenticationException e) {
			errorMessage = "登入失敗錯誤資訊:" + e;
			LOGGER.error(errorMessage);
			e.printStackTrace();
			token.clear();
		}
		session.setAttribute("ErrorMessage", errorMessage);
		return "error";
	}
}

認證服務類
@Service
public class SystemAuthorizingRealm extends AuthorizingRealm {

	@Resource(name = "userService")
	private UserService userService;

	// 授權
	protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection arg0) {
		// TODO Auto-generated method stub
		return null;
	}

	// 認證
	protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authcToken) throws AuthenticationException {
		UsernamePasswordToken token = (UsernamePasswordToken) authcToken;

		Users user = userService.getUser(token.getUsername());
		if (user != null) {
			return new SimpleAuthenticationInfo(user.getName(), user.getPassword(), "");
		} else {
			return null;
		}
	}
}

使用者服務類
@Service("userService")
public class UserServiceImpl implements UserService {


@Autowired
private UserDao userDao;


public Users getUser(String userName) {
Users users = null;
try {
users = userDao.searchUser(userName);
} catch (DataAccessException e) {
e.printStackTrace();
}
return users;
}
}

資料庫操作類
@Repository("UserDao")
public class UserDaoImpl extends BaseDaoImpl implements UserDao {

public Users searchUser(String userName) throws DataAccessException{
Users users = null;
try {
Session session = sessionFactory.openSession();
Query query = session.createQuery("from Users a where a.name=:name").setString(
"name", userName);
users = (Users) query.uniqueResult();
session.close();
} catch (Throwable e) {
throw new DataAccessException(e);
}
return users;

}
}


5. 內建表單過濾器

上面的程式是使用Spring的Web控制器來獲取頁面提交的資料,也可以使用Shiro內建的表單過濾器來實現頁面資料提交。 修改applicationContext.xml增加過濾器
<bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
		<property name="securityManager" ref="securityManager" />
		<property name="loginUrl" value="/login.do" />
		<property name="successUrl" value="/main.do" />
		<property name="unauthorizedUrl" value="/error.do" />  
		<property name="filters">
			<util:map>
				<entry key="authc">
					<bean class="com.peter.smallshow.security.CustomFormAuthenticationFilter">
						<property name="usernameParam" value="loginName" />
						<property name="passwordParam" value="password" />
					</bean>
				</entry>
			</util:map>
		</property>
		<property name="filterChainDefinitions">
			<value>
				/index.do = anon
				/login.do = authc
				/** = authc

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

表單中的引數固定寫法是username、password、rememberMe。
可以通過<property name="usernameParam" value="loginName" />來設定
自定義的表單過濾類
@Service
public class CustomFormAuthenticationFilter extends FormAuthenticationFilter {
	protected AuthenticationToken createToken(ServletRequest request, ServletResponse response) {
		String username = getUsername(request);
		String password = getPassword(request);
		if (password == null) {
			password = "";
		}
		boolean rememberMe = false;
		String host = getHost(request);
		return new UsernamePasswordToken(username, password.toCharArray(), rememberMe, host);

	}

}

6.工程程式碼

相關推薦

Apache Shiro 身份認證例子

1. 概述 在本例子中使用Apache Shiro在Web應用中實現身份認證,將Shiro與Spring進行整合,使用內嵌的derby資料庫儲存使用者資訊。 持久層為Hibernate,資料庫連線池為alibaba druid。 2. 準備 建立一個內嵌的derby資料庫,

Apache shiro叢集實現 (三)shiro身份認證Shiro Authentication)

<span style="font-size:18px;">package com.api6.shiro.demo1; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; impo

Apache Shiro 許可權認證(1)

Shiro的許可權認證 :   程式設計式授權 :                    

Shiro 身份認證實現

一. 身份認證       身份驗證,即在應用中誰能證明他就是他本人。一般提供如他們的身份ID一些標識資訊來表明他就是他本人,如提供身份證,使用者名稱 / 密碼來證明。       在 shiro

shiro身份認證(第一章)

shiro版本資訊: <dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-core</artifactId>

ShiroApache Shiro架構之身份認證(Authentication)

trac pretty asm 安全保障 軟件測試 釋放 model tac 讀取配置文件 Shiro系列文章: 【Shiro】Apache Shiro架構之權限認證(Authorization) 【Shiro】Apache Shiro架構之集成web

使用Apache Shiro進行身份認證-密碼加密

在進行身份認證時,使用者的密碼一般是用密文的形式存放在資料庫中。這樣在做比對時不能直接使用使用者提交的明文口令。 在Shiro中使用org.apache.shiro.authc.credential.SimpleCredentialsMatcher做憑證資訊的比對。Simp

使用Apache Shiro進行身份認證

本文介紹瞭如何在WEB應用中使用Shiro進行身份認證。 在web.xml檔案中配置一個Servlet ContextListener的監聽器和Filter過濾器。 <listener> <listener-class>org.apache.s

使用shiro緩存用戶身份信息的時候報:java.io.NotSerializableException: org.apache.shiro.util.SimpleByteSource

解決問題 equals ola sim source ali ide string 問題 最近在使用shiro緩存用戶的身份信息的時候,報了simpleByteSource不能序列化,跟進源碼一看,原來這個類沒有實現序列化的接口,但是我在緩存身份信息的實現又要用到這個類,解

Shiro(2)-身份認證

基本概念 身份驗證 即在應用中誰能證明他就是他本人。一般提供如他們的身份ID 一些標識資訊來表明他就是他本人,如提供身份證,使用者名稱/密碼來證明。在 shiro 中,使用者需要提供principals (身份)和credentials(證明)給shiro,從而應用能驗證使用者身份

Apache Shiro(二)——認證與授權

Apache Shiro 是一個強大而靈活的開源安全框架,它乾淨利落地處理身份認證,授權,企業會話管理和加密。 Shiro 架構如下圖所示: 認證 身份認證 身份驗證:一般需要提供如身份 ID 等一些標識資訊來表明登入者的身份,如提供 email,使用者名稱/密碼來證明。在

Spring Boot2整合Shiro(1):身份認證

Spring Boot2整合Shiro(1):身份認證   前言 本文主要介紹了在Spring Boot2專案中整合Shiro實現登入認證。本文假設讀者已經對Shiro和基於RBAC的許可權控制系統有了基本的認識。  本專案沒有資料庫,也就沒有dao層,所有的使用者和

Apache Zookeeper 官方文件》ZooKeeper可插入式身份認證

原文地址 ZooKeeper執行在帶有數量眾多並且各不相同的身份認證schemes(檢視)的各種不同環境中,所以它擁有完整的可插入式身份驗證框架。甚至它內建的身份驗證schemes也使用了可插入式身份驗證框架。 想搞清楚身份驗證框架式是如何工作的,你首先必須弄明白兩個主要的身份驗證操作。該框架

Shiro中最簡單的一個身份驗證例子

Shiro作為一個Java安全框架,身份驗證是它最基本的功能。 首先給出shiro的Maven配置 <dependencies> <dependency>

apache身份認證

apache的認證安全配置,訪問資源時,彈出登陸框需要使用者名稱密碼 1: httpd.conf中,對要做認證的目錄進行設定 <Directory "/opt/vhost/xxx.com/www">    Options Indexes FollowSymLin

Apache Shiro 移動端認證回撥函式授權登入

在J2EE專案開發中,若用到Apache Shiro許可權框架,若需為移動端提供登入介面並提供授權認證則需要對移動端提供的登入資訊進行處理,封裝到token中,然後交由Apache Shiro進行認證回撥函式授權登入,下面是本人在專案開發中的實現方式: /**

Apache James SMTP身份認證

SMTP身份認證 (SMTP AUTH) SMTP身份認證是一種保證SMTP伺服器安全的方法,它要求希望通過SMTP伺服器轉發 郵件(即郵件最終傳送給另一個SMTP伺服器)的使用者在傳送訊息之前必須先向James表明自己的身份。 這樣垃圾郵件傳送者就不能用你

apache shiro與spring整合、動態filterChainDefinitions、以及認證、授權

apache shiro是一個安全認證框架,和spring security相比,在於他使用了比較簡潔易懂的認證和授權方式。其提供的native-session(即把使用者認證後的授權資訊儲存在其自身提供Session中)機制,這樣就可以和HttpSession、EJB

SpringBoot學習:整合shiro身份認證和許可權認證),使用EhCache快取

專案下載地址:http://download.csdn.NET/detail/aqsunkai/9805821 (一)在pom.xml中新增依賴: <properties> <shiro.version>1.3.2</shiro.ve

Shiro身份認證(Authentication)

Apache Shiro 是一個強大且靈活的 Java 開源安全框架,擁有登入認證、授權管理、企業級會話管理和加密等功能,相比 Spring Security 來說要更加的簡單。本文主要介紹 Shiro 的登入認證(Authentication)功能,主要從 Shiro 設計