代码改变世界

shiro-06

2018-11-03 17:12  crow!  阅读(153)  评论(0编辑  收藏  举报

输据库认证

Member.java

package cn.mldn.vo;

import java.io.Serializable;

public class Member implements Serializable {
    private String mid ;
    private String name ;
    private String password ;
    public String getMid() {
        return mid;
    }
    public void setMid(String mid) {
        this.mid = mid;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
    
}

MemberLoginService.java

package cn.mldn.service;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.HashSet;
import java.util.Set;

import cn.mldn.vo.Member;

public class MemberLoginService {
    private Connection conn ;
    
    private static final String DBDRIVER = "org.git.mm.mysql.Driver" ;
    private static final String DBURL  = "jdbc:mysql://192.168.42.3:3306/shirodb" ;
    private static final String DBUSER = "ROOT" ;
    private static final String PASSWORD = "mysqladmin" ;
    private PreparedStatement pstmt = null ;
    public MemberLoginService () {
        this.connectDataBase();
    }
    
    public Member get (String username) {
        Member vo = null ;
        try {

            String sql = "SELECT mid , password FROM member WHERE mid=?" ;
            this.pstmt = this.conn.prepareStatement(sql);
            this.pstmt.setString(1, username);
            ResultSet rs = this.pstmt.executeQuery(); 
            
            if (rs.next()) {
                vo = new Member() ;
                vo.setMid(rs.getString(1));
                vo.setPassword(rs.getString(2));
            }
            
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        
        return vo ;
    }
    
    /**
     *  SELECT flag FROM role WHERE rid IN (
     *      SELECT rid FROM member_role WHERE mid=? )
     */
    public Set<String> listRolesByMember(String mid) {
        Set<String> allRoles = new HashSet<String>() ;
        String sql = " SELECT flag FROM role WHERE rid IN ( SELECT rid FROM member_role WHERE mid=? )" ;
        
        try {
            this.pstmt = this.conn.prepareStatement(sql) ;
            this.pstmt.setString(1, mid);
            ResultSet rs = this.pstmt.executeQuery() ;
            while(rs.next()){
                allRoles.add(rs.getString(1)) ;
            }
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return allRoles;
    }
    
    /**
     * 
     * @param mid
     * @return
     */
    public Set<String> listActionsByMember(String mid) {
        Set<String> allActions = new HashSet<String>() ;
        String sql = " SELECT flag FROM action WHERE actid IN ( SELECT actid FROM role_action WHERE rid in ("
                + "SELECT rid FROM member_role WHERE mid=?"
                + ") )" ;
        
        try {
            this.pstmt = this.conn.prepareStatement(sql) ;
            this.pstmt.setString(1, mid);
            ResultSet rs = this.pstmt.executeQuery() ;
            while(rs.next()){
                allActions.add(rs.getString(1)) ;
            }
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return allActions;
    }
    
    
    public void close() {
        if(this.conn != null){
            try {
                this.conn.close();
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }
    
    private void connectDataBase(){
        try {
            Class.forName(DBDRIVER);
            this.conn = DriverManager.getConnection(DBURL,DBUSER,PASSWORD);
            
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
 }

MyRealm.java

package cn.mldn.realm;

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

import cn.mldn.service.MemberLoginService;
import cn.mldn.vo.Member;

public class MyRealm extends AuthorizingRealm {

    @Override
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
        System.out.println("*********** 1、用户登录认证操作的处理   doGetAuthenticationInfo ***********");
        // 登录认证的方法先执行,需要用它来判断登录的用户信息是否合法
        String username = (String) token.getPrincipal() ; // 取得用户名
        MemberLoginService service = new MemberLoginService() ;
        Member vo = service.get(username) ; // 取得的是用户的信息
        service.close();
        if (vo == null) {
            throw new UnknownAccountException("该用户不存在!");
        }
        else {  //进心密码验证处理
            String password = new String((char []) token.getCredentials());
            // 将数据库中的密码与输入的密码进行比较,这样就可以确定当前用户是否可以正常的登录了。
            if(vo.getPassword().equals(password)) {
                AuthenticationInfo auth = new SimpleAuthenticationInfo(username,password,"memberRealm");
                return auth ;
            }
            else {
                throw new IncorrectCredentialsException("密码错误");
            }
        }
    }
    
    @Override
    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
        System.out.println("*********** 2、用户角色与权限 doGetAuthorizationInfo  ***********");
        String username = (String) principals.getPrimaryPrincipal() ; // 取得用户名
        SimpleAuthorizationInfo auth = new SimpleAuthorizationInfo() ; // 定义授权信息的返回处理
        MemberLoginService service = new MemberLoginService() ;
        auth.setRoles(service.listRolesByMember(username)); // 所有的角色必须以set集合出现
        auth.setStringPermissions(service.listActionsByMember(username));
        service.close();
        
        
        return null;
    }
    
}

数据库创建脚本

CREATE DATABASE shirodb CHARACTER SET UTF8 ;

USE shirodb ;

DROP TABLE member ;

CREATE TABLE member (
    mid            VARCHAR(50) ,
    password       VARCHAR(50) ,
    name           VARCHAR(50) ,
    locked         INT ,
    CONSTRAINT     pk_mid PRIMARY KEY (mid)
) ;

CREATE TABLE role (
    rid        INT AUTO_INCREMENT ,
    title      VARCHAR(50) ,
    flag       VARCHAR(50) ,
    CONSTRAINT pk_rid PRIMARY KEY (rid)
) ;

CREATE TABLE member_role (
    mid   VARCHAR(50) ,
    rid   INT ,
    CONSTRAINT fk_mid1 FOREIGN KEY(mid) REFERENCES member(mid) ,
    CONSTRAINT fd_rid  FOREIGN KEY(rid) REFERENCES role(rid)
) ;

CREATE TABLE action (
    actid        INT AUTO_INCREMENT ,
    title        VARCHAR(50) ,
    flag         VARCHAR(50) ,
    CONSTRAINT   pk_actid PRIMARY KEY (actid) 
) ;

CREATE TABLE role_action (
    rid            INT ,
    actid          INT ,
    CONSTRAINT fk_rid6   FOREIGN KEY(rid) REFERENCES role(rid),
    CONSTRAINT fd_actid6 FOREIGN KEY(actid) REFERENCES action(actid)
) ;

shiro.ini

[main]
jdbcRealm=cn.mldn.realm.MyRealm
securityManager.realms=$jdbcRealm