Reino personalizado de autenticación

esta

[main]
userRealm=cn.wit.realm.UserRealm
securityManager.realm=$userRealm

Obtenga el nombre de usuario de acuerdo con el tomado, luego consulte la base de datos con el nombre de usuario, devuelva la
información del objeto Usuario , asigne el nombre de usuario y la contraseña, el objeto SimpleAuthenticationInfo pasa el nombre de usuario, la contraseña, el nombre del reino (la clase principal proporciona el método getName, reescribe este método) y luego devuelve este objeto de información. Indica que la información de usuario de la base de datos se le da a shiro, shiro comparará la información de inicio de sesión (en el tomado), si son consistentes, el inicio de sesión es exitoso

UserRealm extiende AuthorizingRealm

package cn.wit.realm;

import java.beans.PropertyVetoException;
import java.sql.ResultSet;
import java.sql.SQLException;

import org.apache.shiro.authc.AuthenticationException;
import org.apache.shiro.authc.AuthenticationInfo;
import org.apache.shiro.authc.AuthenticationToken;
import org.apache.shiro.authc.SimpleAuthenticationInfo;
import org.apache.shiro.authz.AuthorizationInfo;
import org.apache.shiro.realm.AuthorizingRealm;
import org.apache.shiro.subject.PrincipalCollection;

import cn.wit.users.Users;

import com.mchange.v2.c3p0.ComboPooledDataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;

public class UserRealm extends AuthorizingRealm{
    
    
	@Override
	public String getName() {
    
    
		// TODO Auto-generated method stub
		return "uesrRealm";
	}
	@Override
	protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection arg0) {
    
    
		return null;
	}

	@Override
	protected AuthenticationInfo doGetAuthenticationInfo(
			AuthenticationToken taken) throws AuthenticationException {
    
    
			String username=(String) taken.getPrincipal();
			String pwd="";
		
			Connection conn=null;
	        PreparedStatement ps=null;
	        ResultSet rs=null;
	        ComboPooledDataSource cpds=null;
	        try {
    
    
	          //c3p0获取数据库连接conn
	    		cpds= new ComboPooledDataSource();
	    		cpds.setDriverClass("com.mysql.jdbc.Driver");
	    		cpds.setJdbcUrl("jdbc:mysql://localhost:3306/login");
	    		cpds.setUser("root");
	    		cpds.setPassword("wityy");
	    		conn = cpds.getConnection();
	            
	            String sql="select *from users where username=?";
	            ps= conn.prepareStatement(sql);
	            ps.setObject(1,username);
	            rs=ps.executeQuery();
	            while(rs.next()){
    
    
	            	Users users=new Users();
	            	users.setId(rs.getInt("id"));
	            	users.setUsername(rs.getString("username"));
	            	users.setPassword(rs.getString("password"));
	            	pwd=users.getPassword();
	            	username=users.getUsername();
	            }
	        } catch (SQLException e) {
    
    
	            e.printStackTrace();
	        } catch (PropertyVetoException e) {
    
    
				// TODO Auto-generated catch block
				e.printStackTrace();
			}finally {
    
    
	            try {
    
    
	            	if(rs!=null){
    
    
	            		rs.close();
	            	}
	            } catch (SQLException e) {
    
    
	                e.printStackTrace();
	            }
	            try {
    
    
	            	if(ps!=null){
    
    
	            		ps.close();
	            	}
	            } catch (SQLException e) {
    
    
	                e.printStackTrace();
	            }
	            try {
    
    
	            	if(conn!=null){
    
    
	            		conn.close();
	            	}
	            } catch (SQLException e) {
    
    
	                e.printStackTrace();
	            }
	        }
		
		SimpleAuthenticationInfo info=new SimpleAuthenticationInfo(username,pwd,getName());
		
		
		
		return info;
	}

	
}

principal

package cn.wit.shiro;

import org.apache.shiro.SecurityUtils;


import org.apache.shiro.authc.IncorrectCredentialsException;
import org.apache.shiro.authc.UnknownAccountException;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.config.IniSecurityManagerFactory;
import org.apache.shiro.subject.Subject;
import org.apache.shiro.util.Factory;
import org.apache.shiro.mgt.SecurityManager;

/**
 * 完成用户认证功能
 * @author Administrator
 *
 */
public class Authentication {
    
    
	public static void main(String[] args) {
    
    
		//拿到SecurityManager并将它放到环境当中
		Factory<SecurityManager>factory=new IniSecurityManagerFactory("classpath:shiro.ini");
		SecurityManager securityManager = factory.getInstance();
		SecurityUtils.setSecurityManager(securityManager);
		
		//拿到subject接口
		Subject subject = SecurityUtils.getSubject();
		UsernamePasswordToken taken=new UsernamePasswordToken("zhangsan","123");
		try {
    
    
			if(taken!=null){
    
    
				subject.login(taken);
			}
			if(subject.isAuthenticated()){
    
    
				System.out.println("登录成功");
			}
		} catch (UnknownAccountException e) {
    
    
			e.printStackTrace();
			System.out.println("账号或密码错误");
		}catch (IncorrectCredentialsException e) {
    
    
			e.printStackTrace();
			System.out.println("账号或密码错误");
		}
		
		
	}
}

Rastrear el código fuente

Desde el inicio de sesión en SecurityManager, hasta su clase de implementación defaultSecurityManager, llame al método de autenticación del autenticador, ingrese el autenticador, su clase de implementación ModularRealmAuthenticator
Inserte la descripción de la imagen aquí
tiene el método setRealms, ingrese la interfaz de Inserte la descripción de la imagen aquí
Realm, la jerarquía de clases de Realm es la siguiente, que ha implementado una variedad de dominios Por ejemplo, el anterior jdbcRealm ya está definido aquí. Si desea personalizar el reino, debe heredar AuthorizingRealm, y la autorización personalizada también se hereda de esta clase
Inserte la descripción de la imagen aquí

AuthorizingRealm (resumen) es una subclase de
AuthenticatingRealm. Hay un método doGetAuthenticationInfo en AuthenticatingRealm (resumen), que puede personalizar la autenticación
. Hay un método doGetAuthorizationInfo en AuthorizingRealm, que le permite personalizar la autorización.

Hereda el método AuthenticatingRealm, AuthorizingRealm no anula doGetAuthenticationInfo, por lo que la clase heredada debe anular estos dos métodos
Inserte la descripción de la imagen aquí

Inserte la descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/WA_MC/article/details/113554620
Recomendado
Clasificación